美文网首页
修改ref创建的变量导致shallowRef创建的变量也被更新

修改ref创建的变量导致shallowRef创建的变量也被更新

作者: 变量只提升声明不提升赋值 | 来源:发表于2022-06-07 22:12 被阅读0次
    import {ref,shallowRef,triggerRef,customRef} from 'vue'
        let msg = ref('小王')
        let obj = shallowRef({
            name:'小小王'
        })
        const handleCheckBut = ()=>{
            // msg.value = '大王'
            obj.value.name = '大大王'
            // triggerRef(obj)
        }
    

    代码中修改了由shallowRef创建的对象的属性,因为shallowRef只跟踪到.value,不会再往下跟踪,所以这次修改并不会触发试图更新。

    import {ref,shallowRef,triggerRef,customRef} from 'vue'
        let msg = ref('小王')
        let obj = shallowRef({
            name:'小小王'
        })
        const handleCheckBut = ()=>{
            // msg.value = '大王'
            obj.value.name = '大大王'
             triggerRef(obj)
        }
    

    而当我们添加了triggerRef后,试图是会更新的。

    import {ref,shallowRef,triggerRef,customRef} from 'vue'
        let msg = ref('小王')
        let obj = shallowRef({
            name:'小小王'
        })
        const handleCheckBut = ()=>{
             msg.value = '大王'
            obj.value.name = '大大王'
            // triggerRef(obj)
        }
    

    现在有一个由ref创建的变量,我们修改了他的value,并且将triggerRef注释掉了,按理来说obj的更新是不会驱动视图的。但结果确实obj和msg一同在视图上更新了。

    导致这个问题的原因是,ref触发视图更新的api和triggerRef触发视图更新的api是同一个api,而shallowRef在创建变量的时候其实是已经收集了依赖的,只不过没有去更新视图,恰好这个时候ref创建的变量更新导致触发了更新视图的函数,所以将已经收集的依赖一起都更新了。

    相关文章

      网友评论

          本文标题:修改ref创建的变量导致shallowRef创建的变量也被更新

          本文链接:https://www.haomeiwen.com/subject/yukymrtx.html