import { computed, watch, defineComponent } from 'vue'; // Utils import { createNamespace, extend, pick, truthProp } from '../utils'; import { CHECKBOX_GROUP_KEY, CheckboxGroupProvide, } from '../checkbox-group/CheckboxGroup'; // Composables import { useParent } from '@vant/use'; import { useExpose } from '../composables/use-expose'; import { useLinkField } from '../composables/use-link-field'; // Components import Checker, { checkerProps } from './Checker'; const [name, bem] = createNamespace('checkbox'); export default defineComponent({ name, props: extend({}, checkerProps, { bindGroup: truthProp, }), emits: ['change', 'update:modelValue'], setup(props, { emit, slots }) { const { parent } = useParent(CHECKBOX_GROUP_KEY); const setParentValue = (checked: boolean) => { const { name } = props; const { max, modelValue } = parent!.props; const value = modelValue.slice(); if (checked) { const overlimit = max && value.length >= max; if (!overlimit && !value.includes(name)) { value.push(name); if (props.bindGroup) { parent!.updateValue(value); } } } else { const index = value.indexOf(name); if (index !== -1) { value.splice(index, 1); if (props.bindGroup) { parent!.updateValue(value); } } } }; const checked = computed(() => { if (parent && props.bindGroup) { return parent.props.modelValue.indexOf(props.name) !== -1; } return !!props.modelValue; }); const toggle = (newValue = !checked.value) => { if (parent && props.bindGroup) { setParentValue(newValue); } else { emit('update:modelValue', newValue); } }; watch( () => props.modelValue, (value) => emit('change', value) ); useExpose({ toggle, props, checked }); useLinkField(() => props.modelValue); return () => ( ); }, });