关于组件间传递ref对象的思考

Posted 忘忘碎斌bin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于组件间传递ref对象的思考相关的知识,希望对你有一定的参考价值。

关于对象分配给 ref 并在组件间传递的思考

引发思考的案例:App.vue 组件内存在下面info数据。要将其传递给子组件 Home.vue。并且在Home中会对传递过去的值做操作。

const info = ref({
    name: "fzb",
    age: 21
})

直接传递,虽然可以修改,这种方法是通过对象的引用在修改,但是违反了单向数据流的原则。

那么肯定对其做一些额外操作 : 做一层浅拷贝

const homeInfo = ref({ ...props.info });

这样确实可以解决担心数据流的问题,但是:这样数据就不是完完全全的响应式了,为什么这么说?

两种情况:以上方例子辅助讲解

情况一:当在父组件内存在 info.value = { },直接赋值一个新的对象,那么在Home.vue内是无法监听到的,也不会做出改变。

情况二:当在父组件内存在 info.value.age=22 类似的,通过确定的 key值改变数据时,在Home组件内的数据也会跟着发生该变。

为什么?

首先看下ref对应的源码:


回到RefImpl类中

到这里,发现如果给ref分配的值是一个对象,那么实际上就是一个ref对象里面还有一个reactive对象。由此说的通了:
在Home组件内解构,得到的是reactive的引用,那么在App组件内,通过key的修改还是响应式的,因为本质上就是通过reactive在修改值。若直接赋值新对象,那么Home组间对应的ref就无法捕获到变化了。

以上是关于关于组件间传递ref对象的思考的主要内容,如果未能解决你的问题,请参考以下文章

Vue组件通信props$ref$emit,组件传值

Vue父子组件间通信(数据传递)

关于props和state(React)

Vue 组件间通信

笔记react 学习与记录

React组件间的通信