pull/9/head
tangjinzhou 2017-11-02 11:48:38 +08:00
parent b3351a5f7f
commit e0c4090e85
3 changed files with 51 additions and 19 deletions

View File

@ -14,10 +14,14 @@ export default {
default: 'ant-checkbox-group', default: 'ant-checkbox-group',
type: String, type: String,
}, },
value: { defaultValue: {
default: () => [], default: () => [],
type: Array, type: Array,
}, },
value: {
default: undefined,
type: Array,
},
options: { options: {
default: () => [], default: () => [],
type: Array, type: Array,
@ -26,9 +30,15 @@ export default {
model: { model: {
prop: 'value', prop: 'value',
}, },
data () {
const { value, defaultValue } = this
return {
stateValue: value || defaultValue,
}
},
computed: { computed: {
checkedStatus () { checkedStatus () {
return new Set(this.value) return new Set(this.stateValue)
}, },
}, },
created () { created () {
@ -40,17 +50,22 @@ export default {
return false return false
} }
const target = event.target const target = event.target
const { value, checked } = target const { value: targetValue, checked } = target
const { stateValue, value } = this
let newVal = [] let newVal = []
if (checked) { if (checked) {
newVal = [...this.value, value] newVal = [...stateValue, targetValue]
} else { } else {
newVal = [...this.value] newVal = [...stateValue]
const index = newVal.indexOf(value) const index = newVal.indexOf(targetValue)
index >= 0 && newVal.splice(index, 1) index >= 0 && newVal.splice(index, 1)
} }
this.$emit('input', [...new Set(newVal)]) newVal = [...new Set(newVal)]
this.$emit('change', [...new Set(newVal)]) if (value === undefined) {
this.stateValue = newVal
}
this.$emit('input', newVal)
this.$emit('change', newVal)
}, },
setChildCheckbox (children = []) { setChildCheckbox (children = []) {
const { options, $slots, checkedStatus } = this const { options, $slots, checkedStatus } = this
@ -75,6 +90,7 @@ export default {
}, },
watch: { watch: {
value (val) { value (val) {
this.stateValue = val
this.setChildCheckbox(this.$slots.default) this.setChildCheckbox(this.$slots.default)
}, },
}, },

View File

@ -2,7 +2,7 @@
<label :class="classes"> <label :class="classes">
<span :class="checkboxClass"> <span :class="checkboxClass">
<input :name="name" type="checkbox" :disabled="disabled" <input :name="name" type="checkbox" :disabled="disabled"
:class="`${prefixCls}-input`" :checked="!!checked" :class="`${prefixCls}-input`" :checked="stateChecked"
@change="handleChange" @change="handleChange"
/> />
<span :class="`${prefixCls}-inner`" /> <span :class="`${prefixCls}-inner`" />
@ -20,7 +20,8 @@ export default {
default: 'ant-checkbox', default: 'ant-checkbox',
type: String, type: String,
}, },
checked: Boolean, defaultChecked: Boolean,
checked: { type: Boolean, default: undefined },
disabled: Boolean, disabled: Boolean,
isGroup: Boolean, isGroup: Boolean,
value: [String, Number, Boolean], value: [String, Number, Boolean],
@ -31,6 +32,12 @@ export default {
model: { model: {
prop: 'checked', prop: 'checked',
}, },
data () {
const { checked, defaultChecked } = this
return {
stateChecked: checked === undefined ? defaultChecked : checked,
}
},
computed: { computed: {
hasDefaultSlot () { hasDefaultSlot () {
return !!this.$slots.default return !!this.$slots.default
@ -42,10 +49,10 @@ export default {
} }
}, },
checkboxClass () { checkboxClass () {
const { prefixCls, indeterminate, checked, disabled } = this const { prefixCls, indeterminate, stateChecked, disabled } = this
return { return {
[`${prefixCls}`]: true, [`${prefixCls}`]: true,
[`${prefixCls}-checked`]: checked, [`${prefixCls}-checked`]: stateChecked,
[`${prefixCls}-disabled`]: disabled, [`${prefixCls}-disabled`]: disabled,
[`${prefixCls}-indeterminate`]: indeterminate, [`${prefixCls}-indeterminate`]: indeterminate,
} }
@ -55,13 +62,16 @@ export default {
}, },
methods: { methods: {
handleChange (event) { handleChange (event) {
const checked = event.target.checked const targetChecked = event.target.checked
this.$emit('input', checked) this.$emit('input', targetChecked)
const { name, value } = this const { name, value, checked } = this
if (checked === undefined) {
this.stateChecked = targetChecked
}
const target = { const target = {
name, name,
value, value,
checked, checked: targetChecked,
} }
this.$emit('change', { this.$emit('change', {
target, target,
@ -77,5 +87,10 @@ export default {
} }
}, },
}, },
watch: {
checked (val) {
this.stateChecked = val
},
},
} }
</script> </script>

View File

@ -1,8 +1,9 @@
<template> <template>
<div> <div>
<Checkbox :checked="true" @change="change" name="test" value="123" /> <Checkbox :defaultChecked="true" @change="change" value="1">1</Checkbox>
<Checkbox v-model="checked" @change="change" value="2">2</Checkbox>
<Checkbox @change="change" v-model="checked" name="test" value="123">Checkbox</Checkbox> <Checkbox @change="change" v-model="checked" name="test" value="123">Checkbox</Checkbox>
<Checkbox :disabled="true" @change="change" v-model="checked" name="test2" value="222">Checkbox</Checkbox> <Checkbox @change="change" v-model="checked" name="test2" value="222">Checkbox</Checkbox>
<CheckboxGroup v-model="value" @change="change"> <CheckboxGroup v-model="value" @change="change">
<AntButton @click="handleClick"> <AntButton @click="handleClick">
@ -18,7 +19,7 @@
<Checkbox name="test3" value="3" @change="change">Checkbox3</Checkbox> <Checkbox name="test3" value="3" @change="change">Checkbox3</Checkbox>
<Checkbox v-if="showMore" name="test4" value="4">Checkbox4</Checkbox> <Checkbox v-if="showMore" name="test4" value="4">Checkbox4</Checkbox>
</CheckboxGroup> </CheckboxGroup>
<CheckboxGroup :options="options" v-model="value1" @change="change"></CheckboxGroup> <CheckboxGroup :options="options" :defaultValue="['Apple']" @change="change"></CheckboxGroup>
</div> </div>
</template> </template>
<script> <script>