对于Vue 2,你不能直接用v-model
绑定对象,但可以通过在子组件内部处理value
prop的变化并触发input
事件来模拟这一行为。
父组件A
1<template>
2 <ComponentB v-model="item" prop-names="addressId,date,startTime,endTime"/>
3 <ComponentC v-model="item" prop-names="phone,numPeople,who"/>
4 <ComponentD v-model="content"/>
5</template>
6
7<script>
8import ComponentB from './ComponentB.vue';
9import ComponentC from './ComponentC.vue';
10import ComponentD from './ComponentD.vue';
11
12export default {
13 components: { ComponentB, ComponentC, ComponentD },
14 data() {
15 return {
16 item: {
17 addressId: 1,
18 date: '',
19 startTime: '',
20 endTime: '',
21 phone: '',
22 numPeople: '',
23 who: '',
24 content: '',
25 },
26 };
27 },
28};
29</script>
子组件B和C
在子组件B和C中,你需要定义props
来接收父组件传递的数据,并提供一个更新数据的方法来触发input
事件,让父组件知道数据已变更。
1<!-- ComponentB.vue 和 ComponentC.vue 的模板部分 -->
2<!-- 注意这里简化了逻辑,实际需要根据prop-names动态处理 -->
3<input v-model="localItem.date" @input="updateValue('date', localItem.date)"/>
4<!-- 其他输入框类似 -->
5
6<script>
7export default {
8 props: ['value', 'propNames'], // value是从父组件传入的数据,propNames是要处理的属性名
9 computed: {
10 localItem: {
11 get() { return this.value; },
12 set(value) { this.$emit('input', value); }
13 },
14 },
15 methods: {
16 updateValue(prop, value) {
17 const updatedItem = {...this.localItem, [prop]: value};
18 this.$emit('input', updatedItem);
19 },
20 },
21};
22</script>
localItem 计算属性
在Vue 2的子组件中,我们通常会通过props
接收父组件传递的数据。然而,直接修改props
是不被允许的,因为它们应该是只读的。为了能够修改这些数据并反映到父组件,我们通常会创建一个局部的副本。在子组件B和C的例子中,我们使用了一个计算属性localItem
来实现这一点。
- get: 当我们访问
localItem
时,它返回从父组件接收到的value
(即原始数据对象)。 - set: 当我们尝试修改
localItem
时,触发的函数会发出一个input
事件给父组件,同时传递修改后的值。这是因为Vue中v-model
本质上是一个:value
绑定加上@input
事件监听器的简写形式。通过$emit('input', newValue)
,我们可以告诉父组件数据已经变化,并提供了新的数据。
updateValue() 方法
updateValue()
方法是用于处理数据更新逻辑的自定义方法。它的作用是当子组件内的表单元素(如<input>
)发生变化时,捕获这个变化并更新对应的属性值,随后通知父组件数据已被修改。
- 参数:这个方法接受两个参数,第一个是属性名称(
prop
),第二个是该属性的新值(value
)。 - 逻辑:
- 它首先使用ES6的展开运算符
{...}
和计算属性的新值来创建原对象的一个浅拷贝,并更新指定属性的值。这样做是为了确保其他未修改的属性值保持不变。 - 然后,通过调用
this.$emit('input', updatedItem)
,将更新后的对象发送回父组件。这里的input
事件是Vue用来同步v-model
数据的关键,父组件监听到这个事件后,会用新值替换原有的item
对象,从而实现了双向绑定的效果。
- 它首先使用ES6的展开运算符
综上所述,localItem
和updateValue()
共同协作,使得子组件能够安全地修改从父组件传入的数据,并通过事件机制通知父组件数据的变化,从而在Vue 2应用中实现了数据的双向绑定。
标签:绑定,value,vue2,组件,input,数据,localItem,属性 From: https://blog.csdn.net/qq_46662528/article/details/139234742