避免直接改变道具

Posted

技术标签:

【中文标题】避免直接改变道具【英文标题】:Avoid mutating a prop directly 【发布时间】:2019-11-07 05:24:55 【问题描述】:

我收到警告:

app.js:87486 [Vue 警告]:避免直接改变 prop,因为每当父组件重新渲染时,该值都会被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“likescount”

我的刀

        <path-like-toggle likescount="$path->likeCount" isliked="$path->canBeunLiked()" path="$path->slug" type="$path->type" ></path-like-toggle>

Vue 代码

      props:['isliked','path','type','likescount']
    ,
methods:
         like () 
             axios.post(`/$this.type/$this.path/like/`)
                this.likingStatus = true;
                this.likescount ++;
        ,
         unlike () 
             axios.post(`/$this.type/$this.path/unlike/`)
                this.likingStatus = false;
                this.likescount --;

        ,
    

【问题讨论】:

Vue 2 - Mutating props vue-warn的可能重复 请先搜索再询问。 【参考方案1】:

从你的 prop 初始化一个数据属性,并对其进行操作。

export default 
    data() 
        return 
            numberOfLikes: this.likescount
        
    ,

    props: [
        'isliked',
        'path',
        'type',
        'likescount'
    ],

    methods:
        like() 
            axios.post(`/$this.type/$this.path/like/`);

            // ...

            this.numberOfLikes++;
        ,

        unlike() 
            axios.post(`/$this.type/$this.path/unlike/`);

            // ...

            this.numberOfLikes--;
        ,
    

【讨论】:

示例中的组件似乎没有父组件,prop的值是在页面渲染时直接从服务器传递的。 prop 也是静态的(未使用 v-bind 绑定到 Vue 实例),这意味着即使 Vue 有父级,Vue 也无法操作它的值。因此,在这种特定情况下,您的方法是不可能的。【参考方案2】:

正如警告所说,你不能改变道具,删除 this.likescount ++; this.likescount --;

这将消除警告......你的道具应该是纯粹的

【讨论】:

以上是关于避免直接改变道具的主要内容,如果未能解决你的问题,请参考以下文章

Vue关闭组件返回避免直接改变道具

避免直接改变道具(渲染功能)

避免直接改变道具,因为该值将被覆盖

避免直接改变道具,因为每当父组件重新渲染时,该值都会被覆盖

避免在 Nuxt VueJs 中直接改变道具

Vue:props 不会自动分配;手动分配时 - 避免直接改变道具 - 错误