【Vue】错误:[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever ...

错误:[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "introductionList"

问题分析:

父组件通过props传值给子组件,子组件改变props的属性值导致;

父子组件中的数据流是单向的,父子 prop 之间形成了一个单向绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。(父组件更新,子组件中的prop值也会更新,但子组件不能修改由父组件传递过来的值);

当props是对象的时候,子组件直接修改数据,不会引起警告,但最好不要这样操作;

子组件中更改绑定的prop值最好使用计算属性computed解决。

解决方式:

父组件:

<IntroduceVideoEditDiv
              :introduction-list="introductionList"
              @on-change-introduction="onChangeIntroduction"></IntroduceVideoEditDiv>

data () {
    return {
      // 介绍list
      introductionList: []
  },
methods: {
    // 数据的改变在父组件中修改
    onChangeIntroduction (val) {
      this.introductionList = val
    },
}

子组件:定义一个计算属性,处理props的值并返回

<template v-for="(item, index) in introductionList_">
            <div :key="index">
                ...
             </div>
          </template>

props: {
    introductionList: {
      type: Array
    }
  },
computed: {
    // 子组件中更改绑定的prop值最好使用计算属性computed解决
    introductionList_: {
      get () {
        return this.introductionList
      },
      // 将绑定的introductionList改为绑定计算属性值introductionList_,此时的set方法不能写             
      // this.introductionList = val,这样和直接绑定prop中的introductionList是没什么区别的所
      // 以,最好要将此时的introductionList_改变交给父组件控制,通过父组件来改变prop的
      // introductionList值。
      set (val) {
        // introductionList_改变由父组件控制
        this.$emit('on-change-introduction', val)
      }
    }
  },

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值