Vue中子组件props接受父组件传递的值,能不能修改?

Vue中子组件props接受父组件传递的值,能不能修改?

总结

如果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

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,子组件是无法直接修改组件传递的。这是因为Vue遵循了单向数据流的原则,组件向子组件传递的数据是只读的,子组件无法修改它们。 但是,如果需要修改组件的数据,可以通过触发一个事件来实现。具体的步骤如下: 1. 在组件中定义一个数据属性,并将它作为 prop 传递给子组件。 2. 在子组件中,使用 props 接收这个属性,并在需要修改时,触发一个自定义事件。 3. 在组件中监听子组件触发的事件,并在事件处理程序中修改组件的数据。 下面是一个示例: ```vue // 组件 <template> <div> <p>组件:{{ parentValue }}</p> <child-component :childValue="parentValue" @updateParentValue="updateParentValue"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentValue: '初始' }; }, methods: { updateParentValue(value) { this.parentValue = value; } } }; </script> // 子组件 <template> <div> <p>子组件:{{ childValue }}</p> <button @click="updateParentValue">修改组件</button> </div> </template> <script> export default { props: ['childValue'], methods: { updateParentValue() { // 触发自定义事件,将新的传递组件 this.$emit('updateParentValue', '新的'); } } }; </script> ``` 在上面的示例中,组件通过 prop 将 parentValue 传递给子组件。子组件通过点击按钮触发 updateParentValue 方法,并将新的通过自定义事件 updateParentValue 传递组件组件监听该事件,然后在事件处理程序中更新 parentValue 的。这样就实现了子组件修改组件传递的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值