当前位置: 首页 > 知识库问答 >
问题:

[Vue警告]:避免直接变异prop,因为每当父组件重新呈现时,该值将被覆盖

诸葛苏燕
2023-03-14

我正在学习vuejs,但我找不到合适的答案。当我点击编辑年龄按钮或更改我的名字按钮,我得到下面的错误。

[Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“我的名字”

[Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“用户年龄”

代码在这里。

https://codesandbox.io/s/k2197nr4o3

请让我知道这个代码有什么问题。

共有2个答案

羊舌洛华
2023-03-14

改为使用计算值。例如,在您的UserEdit.vue:

在模板中:

<p>User Age: {{ computedUserAge }}</p>

脚本中:

methods: {
    editAge() {
        this.computedUserAge = 30;
    }
},
computed: {
    computedUserAge: {
      get() {
        return this.userAge;
      },
      set(v) {
        this.$emit("ageWasEdited", v);
      }
    }
}
季博
2023-03-14

很明显,您正试图直接更改道具属性。

例如:

props: { name: 'something' }
methods: { 
 change_name(new_name) {
   this.name = new_name
 }
}

不建议这样做,这可能导致反应性不足。

作为解决方案,您可以使用父子通信。因此,每当您想要更改道具时,只需向父组件发出事件。所以上面的例子应该是:

props: { name: 'something' }
methods: { 
 change_name(new_name) {
   this.$emit('name-updated', new_name)
 }
}

在父组件上,监听该事件以更改您正在传递的道具:

或者我最喜欢的方法是使用.sync修饰符。因此父组件应该是:

以及子组件上的方法:

 change_name(new_name) {
   this.$emit('update:name', new_name)
 }

如果组件没有父子关系,请查看Vue.js事件总线或Vuex

 类似资料:
  • 我的观点是这样的: 我的星形组件如下所示: 我的css是这样的: 当我点击星号时,控制台上出现如下错误: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“value”(位于C:\xampp\htdocs\myshop\resources\assets\js\components\Star.vue) 我怎样才能解

  • 升级到Vue 2.0我有很常见的问题 我得到警告: 避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“用户名”(在组件中找到) 我读了很多次文档,但仍然不明白如何修复它。 和在主Vue应用中声明。 这是我的代码: 我尝试了,但它似乎不起作用,我不明白为什么。它应该将该值绑定到父级(主Vue应用程序)

  • 我有一个问题与我的道具editToWork: app.js:42491[Vue warn]:避免直接修改道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具正在变异:“任务编辑” 组件TaskComponent.vue 组件EditTaskComponent:

  • 如何解决此错误消息: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“抽屉” 父组件: 子组件:

  • 我有一个对话框组件: 如果我想在父组件中使用它: 这是有效的,我的意思是应用程序不会崩溃。但是我被警告说,我应该声明一个数据/计算属性;这很奇怪,因为如果我想变异5-7个道具,对于它们中的每一个,我也必须在子组件上声明一个数据属性?如果父级有,,数据道具,那么如果我想在子级上变异它们,子级也应该声明它们?我们不是在重复自己吗?我如何防止这种重复?

  • 我得到警告: app.js:87486[Vue警告]:避免直接更改prop,因为每当父组件重新呈现时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。被变异的道具:“喜欢计数” 我的刀锋 Vue代码