【问题标题】:vuejs typescript and child components "Avoid mutating a prop directly"vuejs 打字稿和子组件“避免直接改变道具”
【发布时间】:2019-09-11 11:22:41
【问题描述】:

我在这里转圈。

我有一个 vuejs2 应用程序启动并使用 typescript 运行,但是当我尝试将数据传递给源自商店的子组件时遇到错误。

<template>
    <div>
       <form-error :error422.sync="errors"></form-error>
    </div>
</template>

<script lang="ts">
  import { Component, Vue } from 'vue-property-decorator';
  import FormError from '@/components/FormError422.vue';
  import cloneObj from '@/utils/cloneObj';

  @Component({
    components: {
      FormError,
    },
  })
  export default class RegisterForm extends Vue {
    get errors() {
      return cloneObj(AuthenticationModule.errorRegister);
    }
</script>

孩子

<template>
  <div>
    {{error422.errors}}
  </div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Generic422 } from '@/ms-authentication'

@Component
export default class FormError422 extends Vue {
  @Prop() private error422: Generic422 = {
    errors: [],
  };
}
</script>

但无论我做什么都会引发警告:

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

【问题讨论】:

  • 试试看这个answer
  • 并没有真正启发 typescript 装饰器。但是谢谢

标签: typescript vue.js


【解决方案1】:

我认为您正在尝试将error422 默认值设置为:

errors: [],

您通过= 分配直接在FormError422 类中设置它。

这不是您应该使用@Prop() 装饰器设置默认值的方式。相反,您是直接改变道具,而不是设置默认值。

因此,Vue 会警告你,因为你不应该这样做。

要使用 @Prop 装饰器设置 prop 默认值,请执行以下操作:

@Prop({default: {errors: []}}) private error422!: Generic422;

【讨论】:

  • 啊,我明白了!对装饰师来说很新,他们一直在绊倒我。感谢您的帮助,完美运行。
猜你喜欢
  • 2020-06-23
  • 2019-02-07
  • 2018-08-25
  • 2021-06-18
  • 2019-11-07
  • 2017-11-11
  • 1970-01-01
  • 2018-11-26
  • 2018-03-05
相关资源
最近更新 更多