【发布时间】:2020-12-19 20:33:24
【问题描述】:
我有一个子组件,它是一个 HTML 输入元素。它看起来像这样:
<label-input inputId="formProductId"
inputType="number"
inputName="productId"
:inputEnabled="filters.productId.options"
:label="translations['product_id']"
:placeholder="translations['product_id']"
:data="filters.productId.value"
/>
LabelInput.vue 文件:
<template>
<div class="form-element">
<label :for="inputId" :class="['form-element-title', { 'js-focused': focused }]">{{ label }}</label>
<input @input="updateValue($event.target.value)" :type="inputType" :id="inputId" :name="inputEnabled ? inputName : false" v-model="inputData" :placeholder="placeholder" @focus="focused = true" @blur="focused = false">
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component
export default class LabelInput extends Vue {
@Prop({ default: () => '' }) inputId!: string
@Prop({ default: () => '' }) inputType!: string
@Prop({ default: () => '' }) inputName!: string
@Prop({ default: () => '' }) label!: string
@Prop({ default: () => '' }) placeholder!: string
@Prop({ default: () => {} }) data!: []
@Prop({ default: () => true }) inputEnabled!: string
private inputData = this.data
private focused = false
updateValue (value: string) {
this.$root.$emit('input', {'inputName' : this.inputName, 'inputValue' : value});
}
}
所以模型通过filters.productId.value作为数据传递,然后变成局部变量inputData。
现在,如果我更改输入值,我会使用 updateValue 函数,该函数会发出输入名称并将其值返回到父组件,从而更新原始 filters.productId.value 值。这很好用。
现在的问题是我的父组件上有一个函数,它将 filters.productId.value 值重置回 null。它看起来像这样:
clearFilters() {
for (const [key, value] of Object.entries(this.filters)) {
this.filters[key].value = null;
}
}
现在我的子组件 LabelInput 中的数据没有改变,即使 filters.productId.value 现在为空。如何刷新子组件?
【问题讨论】:
-
看来这个问题是由
this.data没有同步到this.inputData父组件更改the props=data引起的。所以一种解决方案是为this.data添加一只手表,当它的值改变时,让this.inputData=this.data在你的LabelInput.vue中 -
但是 LabelInput 组件不知道数据何时更改。我怎么知道什么时候应该设置它?
标签: javascript typescript vue.js vue-component