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

Vue js watcher不会对更改做出反应

须景胜
2023-03-14

我看到了一些关于vue的问题。js watchers,但我没有找到一个问题来处理我的问题,所以这里是:

在我的组件中。vue我使用以下代码:

...
props: ['value']
,
watch: {
    value(val) {
        console.log(val);
    }
},

在使用此组件的父vue页面中,我使用了以下功能:

<template>
    <div>
        <SomeComponent
            v-model="test"
        ></SomeComponent>
    </div>
</template>
data() {
    return {
        test: {}
    };
},
created() {
    this.test = this.DoSomething();
},

如果我添加了另一个属性,则不会再触发观察者:

<template>
    <div>
        <SomeComponent
            v-model="test"
        ></SomeComponent>
    </div>
</template>
data() {
    return {
        test: {}
    };
},
created() {
    this.test.Prop1 = this.DoSomething();
    this.test.Prop2 = "Test";
},

编辑:在快乐的回答之后,我的组件部分现在看起来像这样:

...
props: ["value"],
watch: {
    value: {
        handler(val) {
            console.log(val);
        },
        deep: true
    }
},

共有2个答案

井逸明
2023-03-14

文件所述:

由于JavaScript的限制,Vue无法检测到某些类型的更改。然而,有一些方法可以绕过它们来保持反应性。

对于对象

Vue无法检测到属性的添加或删除。由于Vue在实例初始化期间执行getter/setter转换过程,因此数据对象中必须存在一个属性,以便Vue对其进行转换并使其响应。例如:

var vm = new Vue({
  data: {
    a: 1
  }
})
// `vm.a` is now reactive

vm.b = 2
// `vm.b` is NOT reactive

Vue不允许向已创建的实例动态添加新的根级别被动属性。但是,可以使用this向嵌套对象添加反应属性$设置(对象、属性名称、值)方法:

在你的情况下,那将是:

created() {
    this.$set(this.test, 'Prop1', this.DoSomething())
    this.$set(this.test, 'Prop2', "Test")
},

或者,您也可以为现有对象分配许多属性,例如,使用Object.assign(),如:

this.test = Object.assign({}, this.test, { 'Prop1': 1, 'Prop2': 2 })
怀刚毅
2023-03-14

这是因为您的prop是一个Object

为了深入观察,你可以这样做:

watch: {
    value: {
        handler(val) {
          console.log(val);
        },
        deep: true
    }
},

而在createdDOM中还没有呈现。所以,您发送给子组件的道具尚未更新。参考链接

和其他答案一样,改变对象的正确方法是使用这个$设置

  mounted() {
    this.$set(this.test, 'Prop1', this.DoSomething())
    this.$set(this.test, 'Prop2', 'Test')
  },
 类似资料:
  • 无论我在Angular 8项目中添加了什么角度材质元素(材质选项卡、材质按钮切换、材质选择、材质输入…),它们都不会更新。例如,在“材质”选项卡中,会绘制涟漪效果,但不会更改选项卡。mat按钮切换显示了类似的行为。mat select中的选项不显示,mat input中的浮动标签不浮动。我的代码基本上来自角度材质页面: BrowserModule和BrowserAnimationsModule在A

  • 我有一个在端口3001上运行的节点后端服务器,以及一个我尝试代理到该端口以获取数据的反应服务器。 现在,我已经在客户端文件夹的package.json文件中包含了“代理”行,告诉React将请求代理到端口3001。 然而,当我试图向服务器上的“test”路由发出一个简单的请求时,React代码不会代理这个请求。它将我发送到localhost:3000/test,而不是localhost:3001/

  • 在这种情况下,我更改选择元素并调用数据更新方法。该方法从状态获取值。但是当数据更新时,状态还没有改变。当您再次调用数据更新时,状态已经更新了如何正确进行更新? 反应成分

  • 我有一个名为子组件模型的输入变量。@Input()型号:任意; 我有一个父控件,它将更新的输入变量发送到child Component。 如何编写childComponent来响应模型的变化?我希望在模型更改时调用childComponent。 想法?

  • 我正在Laravel5.1中创建一个应用程序,它以前工作得很好。我在视图文件中所做的任何更改都会反映在浏览器中。现在,在过去3天中,浏览器中未反映任何更改。 以下是我的视图文件: 主人刀身php 我正在将css文件的名称更改为app。但是当我运行应用程序时,它会显示main。源代码中的css。 我在storage/framework中查找了缓存,它显示了带有旧代码“main”的视图文件。css“我