typescript @Watch decorator未激活

zqry0prt  于 2023-11-20  发布在  TypeScript
关注(0)|答案(2)|浏览(135)

我有一个简单的测试组件,模板看起来像这样:

<template>
  <div>
    <input type="text" v-model="name" class="form-control">
    <h5>{{ message }}</h5>
  </div>
</template>
<script src="./test.ts" lang="ts"></script>

字符串
组件TypeScript看起来像这样:

declare var Vue: typeof Function;
declare var VueClassComponent: any;

import { Component, Inject, Model, Prop, Watch } from "vue-property-decorator";

@VueClassComponent.default({
  template: require("./test.vue"),
  style: require("./test.sass"),
  props: {
    name: String,
    num: Number
  }
})
export default class TestComponent extends Vue {
  name: string;
  num: number;
  message: string = "";

  @Watch("name")
  protected onNameChanged(newName: string, oldName: string): any {
    console.log("setting " + oldName + " to " + newName);
  }

  mounted(this: any): void {
    console.log("mounted called");
    this.message = "Hello " + this.name + " " + this.num;
  }
}


当我在input框中输入时,@Watch(“name”)处理程序从未触发,但我确实在console中得到了以下错误:

[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: "name"


对于input框中输入的每个字符设置一次。我不知道在哪里设置了名称,因为我没有在任何地方设置它。虽然这是我的目标(更新名称),但我一直在阅读你不能直接更改值,你需要设置@Watch处理程序,然后在其他地方设置它们(我仍然不知道确切的 * 如何 *,但现在甚至不能得到它。

yzuktlbb

yzuktlbb1#

根据我们的讨论,这里问题的根源是将name声明为属性。其意图是name是一个内部值,仅用于派生message。在这种情况下,手表是不必要的,计算的就可以了。

declare var Vue: typeof Function;
declare var VueClassComponent: any;

import { Component, Inject, Model, Prop, Watch } from "vue-property-decorator";

@VueClassComponent.default({
  template: require("./test.vue"),
  style: require("./test.sass"),
  props: {
    num: Number
  }
})
export default class TestComponent extends Vue {
  name: string;
  num: number;

  get message(){
      return "Hello " + this.name + " " + this.num;
  }
}

字符串

zynd9foi

zynd9foi2#

这是因为name变量没有初始化,所以还不存在于'this'上。如果它被初始化为任何值,那么就会为它创建一个proxyGetter,手表就会工作。
对于Vue 2,请在此处输入链接描述

相关问题