总结
如果props的数据为对象和数组,是可以直接修改,也不会有报错提示,但是不提倡。
因为我传进来的list是个数组,属于引用类型,修改子组件相当于把父组件也同时修改了,所以没有报错,
如果是个基本类型的数据直接修改那么vue会报错。
父子组件传值时,父组件传递的参数,数组和对象,子组件接受之后可以直接进行修改,并且会传递给父组件相应的值也会修改。
如果传递的值是字符串,直接修改会报错。
不推荐子组件直接修改父组件中的参数,避免这个参数多个子组件引用,无法找到造成数据不正常的原因
原因
单向数据流
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。
————————————————
1. sync修饰符
Vue中的数据是单向数据流:父级 prop 的更新会向下流动到子组件中,但是反过来则不行,即子组件无法直接修改父组件中的数据。
但我们常常会遇到需要在子组件中修改父组件数据的场景。.sync修饰符就可以帮助我们实现这种功能。
1.父组件
//:is-show.sync="detailVisible"
<WriteOffDialog :visible.sync="writeOffShow" ></WriteOffDialog>
2.子组件
cancel() {
this.$emit('update:visible', false)
//this.$emit('update:isShow', false)
// 或者如下也可以
//this.$emit('update:is-show', false)
},
或者
// 父组件
<todo-list :list.sync="list" />
// 子组件
methodName(index) {
this.$emit('update:list', this.newList)
}
二、子组件深拷贝
在子组件修改props的方法:
//1. 子组件data中拷贝一份,注意引用类型需要深拷贝,根据需求可以watch监听
data() {
return {
newList: this.list.slice()
}
},
watch: {
list(newVal) {
this.newList = newVal
}
}
// 2. 通过计算属性修改
computed: {
nList() {
return this.list.filter(item => {
return item.isChecked
})
}
}
链接: https://www.jianshu.com/p/db0c334e21b1.
链接: https://blog.csdn.net/weixin_62277266/article/details/123392861
链接: https://blog.csdn.net/michiko98/article/details/118372328?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3-118372328-blog-123392861.pc_relevant_downloadblacklistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3-118372328-blog-123392861.pc_relevant_downloadblacklistv1&utm_relevant_index=6
链接: https://wenku.baidu.com/view/5981ba3aa11614791711cc7931b765ce05087ab6.html
链接: https://blog.csdn.net/BoZai_ya/article/details/125300036