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

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

柳业
2023-03-14

升级到Vue 2.0我有很常见的问题

我得到警告:

避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“用户名”(在组件中找到)

我读了很多次文档,但仍然不明白如何修复它。

用户名密码在主Vue应用中声明

这是我的代码:

var GuestMenu = Vue.extend({
   props : ['username', 'password'],
      template: `
        <div id="auth">
            <form class="form-inline pull-right">
                <div class="form-group">
                    <label class="sr-only" for="UserName">User name</label>
                  <input type="username" v-model="username" class="form-control" id="UserName" placeholder="username">
                </div>
                <div class="form-group">
                  <label class="sr-only" for="Password">Password</label>
                  <input type="password" v-model="password" class="form-control" id="Password" placeholder="Password">
                </div>
            </form>
        </div>`,
    });
App = new Vue ({ 
   el: '#app',
  data: 
    {
      topMenuView: "guestmenu",
      contentView: "guestcontent",
      username: "",
      password: "",

    }
})

我尝试了v-bind,但它似乎不起作用,我不明白为什么。它应该将该值绑定到父级(主Vue应用程序)

共有3个答案

苗烈
2023-03-14

VUE JS认为这是反模式。例如,声明和设置一些道具,如

this.propsVal = 'new Props Value'

因此,要解决这个问题,您必须从道具中获取Vue实例的数据或计算属性的值。喜欢

props: ['propsVal'],
data: function() {
   return {
       propVal: this.propsVal
   };
},
methods: {
...
}

你可以像平常一样使用道具的价值。

岳承悦
2023-03-14

您应该使用getter和setter创建一个计算属性,然后使用$emit更新该属性,例如:

var GuestMenu = Vue.extend({
    props: ['username', 'password'],
    template: `
    <div id="auth">
        <form class="form-inline pull-right">
            <div class="form-group">
                <label class="sr-only" for="UserName">User name</label>
              <input type="username" v-model="usernameInput" class="form-control" id="UserName" placeholder="username">
            </div>
            <div class="form-group">
              <label class="sr-only" for="Password">Password</label>
              <input type="password" v-model="passwordInput" class="form-control" id="Password" placeholder="Password">
            </div>
        </form>
    </div>`,
    computed: {
        usernameInput: {
            get: function(){
                return this.username;
            },
            set: function(newValue){
                this.$emit('update:username', newValue)
            }   
        },
        passwordInput: {
            get: function(){
                return this.password;
            },
            set: function(newValue){
                this.$emit('update:password', newValue)
            }   
        },
    }
});
南宫天逸
2023-03-14

在上的Vue 2.3.0中,您可以使用.sync修改器:

样本来自https://vuejs.org/v2/guide/components-custom-events.html#sync-修饰语:

<text-document :title.sync="title"></text-document>

在你的控制器里。。。

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

  • 我是Vue JS的新手,我遇到了这个问题,我试图通过将父道具传递给孩子来制作数据表 我犯了这个错误 [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具正在变异:“editem” 这是我的密码 这是我的页面: 这是我的组件:

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

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

  • 我正在学习vuejs,但我找不到合适的答案。当我点击编辑年龄按钮或更改我的名字按钮,我得到下面的错误。 [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“我的名字” [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“用户年龄” 代码在这里。

  • 我有一个组件,我想在不同的页面上使用。嗯,它在第一次切换之前工作良好。它显示像以前一样,但是当我单击“关闭”按钮时,它会关闭,但是控制台输出: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“可见” 发现于 --- 在那之后点击就不显示了 有办法解决这个问题吗? Snackbar.vue 我ogin.vue