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

@来自vue-属性-装饰器的模型装饰器生成vue-警告:避免突变

酆浩邈
2023-03-14

我在这个库中使用typescript。我在文件HomePage.vue中有以下代码:

<template>
    <div>Write something x: <input v-model="someName" type="text"></div>
</template>

<script lang="ts">
import { Component, Model, Vue } from "vue-property-decorator";

@Component
export default class HomePage extends Vue {
    @Model() someName: string;
}
</script>

编译完成后,在浏览器中运行,并在vue警告后chrome控制台中的输入框中键入内容:

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

你知道怎么解决这个问题吗?

共有3个答案

司寇望
2023-03-14

对于v型,应使用在数据中定义的特性。

我看到您正在使用一个速记@Model,但是您需要的是@Supply来定义data属性。

提供()foo='foo'

https://github.com/kaorun343/vue-property-decorator

仲孙超
2023-03-14

自从v.9.1.2view-属性-装饰器现在支持@VModel装饰器。

哪里

import { Vue, Component, VModel } from 'vue-property-decorator'

@Component
export default class CustomComponent extends Vue {
  @VModel() name!: string
}

可以使用双向数据绑定,组件内部为name,外部为v-model=“…”。没有恼人的警告!

https://github.com/kaorun343/vue-property-decorator#-vmodelpropsargs propoptions装饰器

强硕
2023-03-14

TL:DR

我是Vue新手(来自React),但据我所知,上面的答案没有错,但它没有回答如何使用@Model decorator的问题。提供和注入是将道具从父代传递给子代的一种过度使用。文档不清楚,所以我在这个问题上费尽心思。但请记住,该包指的是道具。因此,@Prop、@PropSync@Model应该位于子组件。这就是我所做的,它没有抛出那个可怕的控制台错误。父组件:

<template>
  <div>
     <input type="text" v-model="modelText" />
    <Child 
      :modelText="modelText"
    />
  </div>
</template>

<script lang="ts">
import Component from 'vue-class-component';
import Vue from 'vue';
import Child from './Child.vue';

@Component({
  components: {
    Child,
  }
})
export default class Parent extends Vue {
  private modelText: string = 'model-text';
}
</script>

对于子组件:

<template>
    <div>
      @Model: {{modelText}}
    </div>
</template>

<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
import { Prop, PropSync, Model } from 'vue-property-decorator';

@Component({

})
export default class Child extends Vue {
  @Model('input', { type: String }) modelText!: string;
}
</script>
 类似资料:
  • Object.defineProperty(target, key, { writable: false }); } @ReadOnly // notice there are no `()` name: string; const t = new Test(); t.name = 'jan';

  • 问题 你想写一个装饰器来包装一个函数,并且允许用户提供参数在运行时控制装饰器行为。 解决方案 引入一个访问函数,使用 nonlocal 来修改内部变量。 然后这个访问函数被作为一个属性赋值给包装函数。 from functools import wraps, partial import logging # Utility decorator to attach a function as an

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Circle.java,ShapeDecorator.java,RedShapeDecorator.java,DecoratorPatternDemo.java装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器是旨在提升重用性能的一种结构性设计模式。同Mixin类似,它可以被看作是应用子类划分的另外一种有价值的可选方案。 典型的装饰器提供了向一个系统中现有的类动态添加行为的能力。其创意是装饰本身并不关心类的基础功能,而只是将它自身拷贝到超类之中。 它们能够被用来在不需要深度改变使用它们的对象的依赖代码的前提下,变更我们希望向其中附加功能的现有系统之中。开发者使用它们的一个通常的理由是,它们的应用程