方法一:

实现组件上的v-model绑定

props: {
    modelValue: {
      type: Boolean,
      default: false
    }
  },

setup(props, { emit }) {
    const checked = ref(false)
    const changeChecked = () => {
      checked.value = !checked.value
      // 使用emit通知父组件
      emit('update:modelVal', checked.value)
    }

    // 侦听父组件传递数据
    watch(
      () => props.modelValue,
      (newVal) => {
        checked.value = newVal
      },
      { immediate: true }
    )

    return { checked, changeChecked }
  }

方法二:

使用@vueuse/core

 props: {
    modelValue: {
      type: Boolean,
      default: false
    }
  },
  setup (props, { emit }) {
    // 使用useVModel实现双向数据绑定v-model指令
    // 1. 使用props接收modelValue
    // 2. 使用useVModel来包装props中的modelValue属性数据
    // 3. 在使用checked.value就是使用父组件数据
    // 4. 在使用checked.value = '数据' 赋值,触发emit('update:modelvalue', '数据')
    const checked = useVModel(props, 'modelValue', emit)
    const changeChecked = () => {
      const newVal = !checked.value
      // 通知父组件
      checked.value = newVal
      // 让组件支持change事件
      emit('change', newVal)
    }
    return { checked, changeChecked }
  }

# 组件上使用

<XtxCheckbox :modelValue="item.selected" @change="checkOne(item.skuId, $event)" />

默认自定义事件的第一个参数就是emit时传的值,如果不放在第一个参数就要使用$event接收。