Vue.js 在父子组件之间动态映射数据
Vue.js Dynamically Mapping Data Between Parent and Child Component
我觉得在尝试使数据在父组件和子组件之间正确映射时,我将走上一条效率极低的道路。
如果我有一个像下面这样的简单的 Child Vue 元素
common/InputText.vue
<template>
<input v-bind:id="name" v-bind:value="value" v-on:input="changed($event, $event.target.value)">
</template>
<script>
props: ['name', 'value'],
methods: {
changed(event, value) { this.$emit('emitChanged', event, value); }
}
</script>
如果我有一个如下所示的父 Vue 元素,它会将数据绑定到子元素。问题是它似乎只是从父级绑定到子级,父级数据没有更新
Parent.vue
<input-text name="field01" v-bind:value="field01" @emitChanged="changed"></input-text>
<input-text name="field02" v-bind:value="field02" @emitChanged="changed"></input-text>
<script>
import inputText from "./common/InputText.vue";
export default {
data() {
return() {
field01: '',
field02: ''
}
},
components: {
input-text: inputText
},
changed(event, newValue) {
console.log(newValue);
}
}
</script>
通过将 changed
方法更改为以下
,我可以使用子 returns 的任何数据更新父数据
changed(event, newValue) {
console.log(newValue);
if( event.target.id == 'field01' ) {
this.field01 = newValue;
}
if( event.target.id == 'field02' ) {
this.field02 = newValue;
}
}
虽然这感觉像是一个 hack,但如果有很多输入字段,它将变得难以管理。重新更新父数据的正确方法是什么?
这就是 v-model
有用的原因,您可以通过以下方式更改代码来解决您的问题,而无需使用 v-model
。但我建议尝试实施 v-model
方式。
<template>
<input v-bind:id="name" v-bind:value="value" v-on:input="changed($event, $event.target.value)">
</template>
<script>
props: ['name', 'value'],
methods: {
changed(event) { this.$emit('emitChanged', event); }
}
</script>
<input-text name="field01" v-bind:value="field01" @emitChanged="changed($event, 'field01')"></input-text>
<input-text name="field02" v-bind:value="field02" @emitChanged="changed($event, 'field02'"></input-text>
<script>
import inputText from "./common/InputText.vue";
export default {
data() {
return() {
field01: '',
field02: ''
}
},
components: {
input-text: inputText
},
changed(event, field) {
this[field] = event.target.value
}
}
</script>
我觉得在尝试使数据在父组件和子组件之间正确映射时,我将走上一条效率极低的道路。
如果我有一个像下面这样的简单的 Child Vue 元素
common/InputText.vue
<template>
<input v-bind:id="name" v-bind:value="value" v-on:input="changed($event, $event.target.value)">
</template>
<script>
props: ['name', 'value'],
methods: {
changed(event, value) { this.$emit('emitChanged', event, value); }
}
</script>
如果我有一个如下所示的父 Vue 元素,它会将数据绑定到子元素。问题是它似乎只是从父级绑定到子级,父级数据没有更新
Parent.vue
<input-text name="field01" v-bind:value="field01" @emitChanged="changed"></input-text>
<input-text name="field02" v-bind:value="field02" @emitChanged="changed"></input-text>
<script>
import inputText from "./common/InputText.vue";
export default {
data() {
return() {
field01: '',
field02: ''
}
},
components: {
input-text: inputText
},
changed(event, newValue) {
console.log(newValue);
}
}
</script>
通过将 changed
方法更改为以下
changed(event, newValue) {
console.log(newValue);
if( event.target.id == 'field01' ) {
this.field01 = newValue;
}
if( event.target.id == 'field02' ) {
this.field02 = newValue;
}
}
虽然这感觉像是一个 hack,但如果有很多输入字段,它将变得难以管理。重新更新父数据的正确方法是什么?
这就是 v-model
有用的原因,您可以通过以下方式更改代码来解决您的问题,而无需使用 v-model
。但我建议尝试实施 v-model
方式。
<template>
<input v-bind:id="name" v-bind:value="value" v-on:input="changed($event, $event.target.value)">
</template>
<script>
props: ['name', 'value'],
methods: {
changed(event) { this.$emit('emitChanged', event); }
}
</script>
<input-text name="field01" v-bind:value="field01" @emitChanged="changed($event, 'field01')"></input-text>
<input-text name="field02" v-bind:value="field02" @emitChanged="changed($event, 'field02'"></input-text>
<script>
import inputText from "./common/InputText.vue";
export default {
data() {
return() {
field01: '',
field02: ''
}
},
components: {
input-text: inputText
},
changed(event, field) {
this[field] = event.target.value
}
}
</script>