55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Vue
		
	
	
| <docs>
 | ||
| ---
 | ||
| order: 1
 | ||
| title:
 | ||
|   zh-CN: 全选
 | ||
|   en-US: Check all
 | ||
| ---
 | ||
| 
 | ||
| ## zh-CN
 | ||
| 
 | ||
| 在实现全选效果时,你可能会用到 `indeterminate` 属性
 | ||
| 
 | ||
| ## en-US
 | ||
| 
 | ||
| The `indeterminate` property can help you to achieve a 'check all' effect.
 | ||
| 
 | ||
| </docs>
 | ||
| 
 | ||
| <template>
 | ||
|   <div>
 | ||
|     <a-checkbox
 | ||
|       v-model:checked="state.checkAll"
 | ||
|       :indeterminate="state.indeterminate"
 | ||
|       @change="onCheckAllChange"
 | ||
|     >
 | ||
|       Check all
 | ||
|     </a-checkbox>
 | ||
|   </div>
 | ||
|   <a-divider />
 | ||
|   <a-checkbox-group v-model:value="state.checkedList" :options="plainOptions" />
 | ||
| </template>
 | ||
| <script lang="ts" setup>
 | ||
| import { reactive, watch } from 'vue';
 | ||
| const plainOptions = ['Apple', 'Pear', 'Orange'];
 | ||
| const state = reactive({
 | ||
|   indeterminate: true,
 | ||
|   checkAll: false,
 | ||
|   checkedList: ['Apple', 'Orange'],
 | ||
| });
 | ||
| 
 | ||
| const onCheckAllChange = (e: any) => {
 | ||
|   Object.assign(state, {
 | ||
|     checkedList: e.target.checked ? plainOptions : [],
 | ||
|     indeterminate: false,
 | ||
|   });
 | ||
| };
 | ||
| watch(
 | ||
|   () => state.checkedList,
 | ||
|   val => {
 | ||
|     state.indeterminate = !!val.length && val.length < plainOptions.length;
 | ||
|     state.checkAll = val.length === plainOptions.length;
 | ||
|   },
 | ||
| );
 | ||
| </script>
 |