vue报错 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the

vue报错: [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: “***”

翻译:

避免直接改变一个组件中的prop值,因为每当父组件重新渲染时,该prop值都将被覆盖。应在组件中使用基于这个prop值的data或computed属性。

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。

https://cn.vuejs.org/v2/guide/components-props.html#单向数据流

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题。

取而代之的是,在父组件中对传递给子组件的prop使用.sync修饰符,子组件改变prop后,以 this.$emit(‘update: propName’, newvalue)的模式触发事件,告诉父组件我已经更改这个prop值了。
https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修饰符
在父组件中对传递给子组件的prop使用.sync修饰符:

<parent-component v-bind:select-type.sync="selectType"></parent-component>

在子组件js中:

props: {
    selectType: {
      type: Number,
      default: 2
    }
},
methods: {
    select (type, event) {
       this.selectType = type;
       this.$emit('update:selectType', type);
    }
}

有两种常见的试图改变一个 prop 的情形:

  1. 这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值:
  props: ['initialCounter'],
  data: function () {
    return {
      counter: this.initialCounter
    }
  }
  1. 这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:
props: ['size'],
computed: {
    normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}

注意

在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。

选项卡切换时被点击的项高亮:Alt
html

<div class="rating-type border-1px">
  <span
    class="block positive"
    :class="{'active': selectedType===2}"
    @click="select(2, $event)"
  >{{desc.all}}<span class="count">57</span></span>
  <span
    class="block positive"
    :class="{'active': selectedType===0}"
    @click="select(0, $event)"
  >{{desc.positive}}<span class="count">40</span> </span>
  <span
    class="block negative"
    :class="{'active': selectedType===1}"
    @click="select(1, $event)"
  >{{desc.negative}}<span class="count">10</span> </span>
</div>

javascript

// 选择类型默认为ALL
const ALL = 2;
props: {
  selectType: {
    type: Number,
    default: ALL
  }
},
data: function () {
  return {
    selectedType: this.selectType
  }
},
methods: {
  select (type, event) {
    if (!event._constructed) {
      return;
    }
    this.selectedType = type;
  }
}
发布了6 篇原创文章 · 获赞 1 · 访问量 5845
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览