关于VueUse中useVModel返回值的问题

在做商城项目的checkBox的时候,按照自己的思路使用useVModel出现问题,返回值一直为true,代码如下

//我的代码
const checked = useVModel(props, "modelValue", emit);
    const changeChecked = () => {
      checked.value = !checked.value;
     //因为传过来的modelValue为true,这里我认为是可以取反赋值的
    //然而log输出的一直为false
      console.log(checked);    
      emit("change", checked.value);
    };  

//文档代码  
const checked = useVModel(props, 'modelValue', emit)
    const changeChecked = () => {
      const newVal = !checked.value
      checked.value = newVal
      emit('change', newVal)
    }

我当时还不理解,为什么要定义一个中间变量newVal,我觉得我的操作和文档的是一样的,因为我理解赋值之后 newVal  === checked.value,所以我回传了修改之后的checked.value,发现是不生效的。

我将其修改为 !checked.value,生效

//修改后生效代码
const checked = useVModel(props, "modelValue", emit);
    const changeChecked = () => {
      checked.value = !checked.value;
      emit("change", !checked.value);
    };

 

查阅文档得知,并log打印得知,useVModel返回的是计算属性,而不是ref,并不能直接修改check.value的值

 

一开始传checked.value一直为true的原因就是不可直接修改值

其实一想也对:直接修改就等于是改了props的值,这在Vue中是不允许的,需要emit通知父组件改值

 

文档的意思是

 const checked = useVModel(props, 'modelValue', emit)
    const changeChecked = () => {
      const newVal = !checked.value
      // 通知父组件,所以是可以直接修改值的
      checked.value = newVal
      // 让组件支持change事件
      emit('change', newVal)
    }

为什么不直接change事件即可?

 

12-26:做到另一个类似的功能的时候,终于大致有了些模糊的理解:

      // 单纯通知父组件,本组件的值在函数结束前并不会立即变化
      checked.value = newVal
      // 让组件支持change事件,这是为了让父组件能拿到子组件的值,还可以拿到自己的值作为参数传递
      emit('change', newVal)

 

posted @ 2021-12-22 14:25  Jacky02  阅读(862)  评论(0)    收藏  举报