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