117 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 
 | |
| import Checkbox from './Checkbox'
 | |
| import hasProp from '../_util/props-util'
 | |
| export default {
 | |
|   name: 'ACheckboxGroup',
 | |
|   props: {
 | |
|     prefixCls: {
 | |
|       default: 'ant-checkbox-group',
 | |
|       type: String,
 | |
|     },
 | |
|     defaultValue: {
 | |
|       default: () => [],
 | |
|       type: Array,
 | |
|     },
 | |
|     value: {
 | |
|       default: undefined,
 | |
|       type: Array,
 | |
|     },
 | |
|     options: {
 | |
|       default: () => [],
 | |
|       type: Array,
 | |
|     },
 | |
|     disabled: Boolean,
 | |
|   },
 | |
|   model: {
 | |
|     prop: 'value',
 | |
|   },
 | |
|   provide () {
 | |
|     return {
 | |
|       checkboxGroupContext: this,
 | |
|     }
 | |
|   },
 | |
|   data () {
 | |
|     const { value, defaultValue } = this
 | |
|     return {
 | |
|       sValue: value || defaultValue,
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     handleChange (event) {
 | |
|       const target = event.target
 | |
|       const { value: targetValue, checked } = target
 | |
|       const { sValue } = this
 | |
|       let newVal = []
 | |
|       if (checked) {
 | |
|         newVal = [...sValue, targetValue]
 | |
|       } else {
 | |
|         newVal = [...sValue]
 | |
|         const index = newVal.indexOf(targetValue)
 | |
|         index >= 0 && newVal.splice(index, 1)
 | |
|       }
 | |
|       newVal = [...new Set(newVal)]
 | |
|       if (!hasProp(this, 'value')) {
 | |
|         this.sValue = newVal
 | |
|       }
 | |
|       this.$emit('input', newVal)
 | |
|       this.$emit('change', newVal)
 | |
|     },
 | |
|     getOptions () {
 | |
|       const { options } = this.$props
 | |
|       return options.map(option => {
 | |
|         if (typeof option === 'string') {
 | |
|           return {
 | |
|             label: option,
 | |
|             value: option,
 | |
|           }
 | |
|         }
 | |
|         return option
 | |
|       })
 | |
|     },
 | |
|     toggleOption (option) {
 | |
|       const optionIndex = this.sValue.indexOf(option.value)
 | |
|       const value = [...this.sValue]
 | |
|       if (optionIndex === -1) {
 | |
|         value.push(option.value)
 | |
|       } else {
 | |
|         value.splice(optionIndex, 1)
 | |
|       }
 | |
|       if (!hasProp(this, 'value')) {
 | |
|         this.sValue = value
 | |
|       }
 | |
|       this.$emit('input', value)
 | |
|       this.$emit('change', value)
 | |
|     },
 | |
|   },
 | |
|   render () {
 | |
|     const { $props: props, $data: state, $slots } = this
 | |
|     const { prefixCls, options } = props
 | |
|     let children = $slots.default
 | |
|     if (options && options.length > 0) {
 | |
|       children = this.getOptions().map(option => (
 | |
|         <Checkbox
 | |
|           key={option.value}
 | |
|           disabled={'disabled' in option ? option.disabled : props.disabled}
 | |
|           value={option.value}
 | |
|           checked={state.sValue.indexOf(option.value) !== -1}
 | |
|           onChange={() => this.toggleOption(option)}
 | |
|           class={`${prefixCls}-item`}
 | |
|         >
 | |
|           {option.label}
 | |
|         </Checkbox>
 | |
|       ))
 | |
|     }
 | |
|     return (
 | |
|       <div class={prefixCls}>
 | |
|         {children}
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
|   watch: {
 | |
|     value (val) {
 | |
|       this.sValue = val
 | |
|     },
 | |
|   },
 | |
| }
 | |
| 
 |