vue2或3的父传子,传递值或传递引用的区别

147 阅读2分钟

vue2:

1按值传递:

父传子一个值,子组件用如果想修改这个值,直接改props会警告,所以子组件需要用自己的data或者compute或者使用watch式指令来接收,直接用data接收是没有响应式的(父组件改变props不会影响,同时子组件修改接收值也不会影响父组件),用compute接收子组件修改它还要写setter

2按引用传递:

按引用传递时,即父组件传给子组件一个对象,不管什么接收方式,无论是父还是子修改对象中的属性,都会产生双向影响,因为js的引用指向通一个内存地址里的,除非使用深拷贝,传数组也是同理,但有时按索引修改数组对应值时,变化还不能及时出现在视图上就很怪 如果使用vue2使用sync,vue3使用v-model:变量名来进行传参,可以自定update,父组件不用传update函数给子组件

3本质:

实际上这种传值可以类比为将外部变量传给函数形参时,在函数里修改形参的属性是可以的(按值传递),但直接修改形参则不会影响函数外部变量,举个例子:

let obj={
  name:'foo'
}
function fun(foo){
    // 相当于foo=obj,但是直接给foo赋值会开辟一个新的内存
  foo.name='bar' //影响外部obj
  foo=0 //不影响外部
  console.log(foo,obj)
}
fun(obj)

详情参考这篇文章:怎么理解JS函数参数是按值传递 - 知乎 (zhihu.com)

补充:

vue3同理,包裹在ref或者reactive中接收现象也和vue2相同 如果是写react的jsx,就可以更直观的发现这类现象的区别和本质实际上就是来自js