typescript - el decorador @model de vue-property-decorator genera vue-warn: Evita mutar
Uso TypeScript con esta biblioteca. Y tengo el siguiente código en el archivo 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>
Después de la compilación, ejecuta en el navegador y escribe algo en el cuadro de entrada, obtengo en la consola de Chrome la siguiente advertencia de Vue:
[Advertencia de Vue]: Evite modificar una propiedad directamente ya que el valor se sobrescribirá cada vez que el componente padre se vuelva a renderizar. En su lugar, use una propiedad de datos o computada basada en el valor de la propiedad. Propiedad que se está modificando: "someName"
¿Alguna idea de cómo solucionar este problema?
Respuesta #1
TL;DR
Soy nuevo en Vue (vengo de React), pero por lo que entiendo la respuesta de arriba no está mal, aunque no responde a la pregunta de cómo usar el decorador @Model. Provide e Inject es un exceso para pasar props de un componente padre a un hijo. La documentación no es clara, así que me rompí mucho la cabeza con esto. Pero recuerda que el paquete se refiere a props. Por lo tanto, @Prop, @PropSync y @Model deberían estar en el componente hijo. Esto es lo que hice y no me dio ese horrible error en la consola. Componente padre:
<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>
Y para el componente hijo:
<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>
Respuesta #2
Desde la v. 9.1.2, view-property-decorator ahora admite el decorador @VModel.
Dónde
import { Vue, Component, VModel } from 'vue-property-decorator'
@Component
export default class CustomComponent extends Vue {
@VModel() name!: string
}
hará posible usar la vinculación de datos bidireccional con name dentro del componente y v-model="..." desde el exterior. ¡Sin las molestas advertencias!
https://github.com/kaorun343/vue-property-decorator#-vmodelpropsargs-propoptions-decorator
