首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VUE中道具突变警告

VUE中道具突变警告
EN

Stack Overflow用户
提问于 2018-04-26 09:28:58
回答 3查看 946关注 0票数 0

我收到了一个vue警告(因为我的代码不起作用),结果在我的端处出现了一个错误,上面写着:

代码语言:javascript
运行
复制
[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: "editmode"

用它,尝试了这里的建议,但不能使它发挥作用。以下是我的工作:

代码语言:javascript
运行
复制
props:{
    editmode:{
        type: Boolean,
        default: false,
    }
},
methods:{
    toggleM(){
        var editmode = this.editmode;
        editmode = !editmode;
        this.editmode = editmode; 
        if(editmode == false){
            //dothis
        }else{
            //dothat
        }
    },
}

模板

代码语言:javascript
运行
复制
<template>
<div class="ui-table-container-body">
        <div class="ui-table" v-if="Boolean(items.length) || Boolean(Object.keys(items).length)" v-cloak>
            <ui-table-body ref="body" v-model="items"
                :editmode="editmode"
                >
            </ui-table-body>
        </div>
    </div>
</template>

this.editmode = editmode;线是我的控制台中的一条线,有什么方法可以超越它吗?

EN

回答 3

Stack Overflow用户

发布于 2018-04-26 09:50:19

您不应该从组件本身突变道具。请参阅指南的单向数据流部分。您可以使用一个支柱作为初始值,然后在data部分中保留一个值并对其进行变异:

代码语言:javascript
运行
复制
props: {
    editmode: {
        type: Boolean,
        default: false,
    }
},
data () {
    return {
        emode: this.editmode,
    }
},
methods: {
    toggleM () {
        let editmode = this.emode;
        editmode = !editmode;
        this.emode = editmode; 
        if (editmode == false) {
            // dothis
        } else {
            // dothat
        }
    },
}

演示

代码语言:javascript
运行
复制
Vue.component('editbox', {
  template: '<div>' +
    '<button @click="toggleM">{{ btext }}</button>' +
    '<input v-if="emode" />' +
    '</div>',
  props: ['editmode'],
  data () {
    return {
      emode: this.editmode,
    }
  },
  computed: {
    btext () {
      return this.emode ? "Text" : "Edit";
    }
  },
  methods:{
    toggleM() {
        this.emode = !this.emode;
    },
  }
})

var app = new Vue({
  el: '#app',
  data: {
    mode: true,
  }
})
代码语言:javascript
运行
复制
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <editbox :editmode="mode" />
</div>

票数 1
EN

Stack Overflow用户

发布于 2018-04-26 09:50:33

您必须使用data变量作为通往prop的网关。

在组件中,代码代码应该如下所示:

代码语言:javascript
运行
复制
props:{
    editmode:{
        type: Boolean,
        default: false,
    }
},
data: {
  dataEditMode = false
},
watch: {
    'editmode': {
      handler: 'onEditmodeChanged',
      immediate: true,
    },
    'dataEditMode': {
      handler: 'onDataEditModeChanged'
    }
},
methods:{
    toggleM(){
        var editmode = this.dataEditMode;
        editmode = !editmode;
        this.dataEditMode = editmode; 
        if(editmode == false){
            //dothis
        }else{
            //dothat
        }
    },
    onEditmodeChanged (newVal) {
      this.dataEditMode = newVal
    },
    onDataEditModeChanged (newVal) {
      this.$emit('editmodeChanged', newVal)
    }
}

在父组件中包含这个组件应该如下所示:

<my-component-name :editmode="editmode" @editmodeChanged="(e) => { editmode = e }"></my-component-name>

票数 1
EN

Stack Overflow用户

发布于 2018-04-26 10:04:26

我将向父事件发回一个事件,以便它可以修改它的值:

例如(未测试):

子组件

代码语言:javascript
运行
复制
props:{
    editmode:{
        type: Boolean,
        default: false,
    }
},
methods:{
    toggleM(){
        var editmode = !this.editmode;
        this.$emit('changeEditMode', editmode);
        if (editmode == false){
            //dothis
        } else {
            //dothat
        }
    },
}

亲本

代码语言:javascript
运行
复制
<child-component @changeEditMode="editModeChanged" :editmode="editmode"></child-component>

..。

代码语言:javascript
运行
复制
methods:{
    editModeChanged(value){
        this.editmode = value
    },
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50039474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档