当前位置: 首页 > news >正文

vue2如何父组件 对象 双向绑定子组件

对于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)。
  • 逻辑
    1. 它首先使用ES6的展开运算符{...}和计算属性的新值来创建原对象的一个浅拷贝,并更新指定属性的值。这样做是为了确保其他未修改的属性值保持不变。
    2. 然后,通过调用this.$emit('input', updatedItem),将更新后的对象发送回父组件。这里的input事件是Vue用来同步v-model数据的关键,父组件监听到这个事件后,会用新值替换原有的item对象,从而实现了双向绑定的效果。

综上所述,localItemupdateValue()共同协作,使得子组件能够安全地修改从父组件传入的数据,并通过事件机制通知父组件数据的变化,从而在Vue 2应用中实现了数据的双向绑定。

 

http://www.lryc.cn/news/355802.html

相关文章:

  • [Android]在后台线程执行耗时操作,然后在主线程更新UI
  • 平方回文数-第13届蓝桥杯选拔赛Python真题精选
  • 位置编码(三) 2D旋转位置编码
  • 1、pikachu靶场之xss钓鱼复现
  • 弘君资本炒股技巧:股票定向增发是什么意思?是好是坏?
  • vue3项目使用pinia状态管理器----通俗易懂
  • 零基础学Java第二十五天之Lambda表达式
  • VSCode配置Lua5.4安装
  • CI/CD:持续集成/持续部署
  • ComfyUI工作流网站
  • 【机器学习】机器学习基础概念与初步探索
  • 学英语材料:单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目
  • Docker Compose使用
  • 如何优雅的卸载linux上的todesk
  • 【Vue】el-checkbox多选框实现单选效果,选中一个选项则自动取消其他勾选
  • Linux中使用vi编辑器自动缩进4个字符
  • #笔记#笔记#其他
  • gtask笔记
  • 【Linux学习】深入探索进程等待与进程退出码和退出信号
  • Linux:线程
  • 卡到BUG了:删除重发白得积分(以前删除会扣减积分)
  • 轻松拿捏C语言——【字符函数】字符分类函数、字符转换函数
  • 【Rust日报】ratatui版本更新
  • 力扣每日一题 5/28
  • async函数和await函数
  • Redis面试题深度解析
  • Ubuntu 22.04 .NET8 程序 环境安装和运行
  • MetaRTC-ffmpeg arm移植
  • 【乐吾乐3D可视化组态编辑器】模型类型与属性
  • PyQt下拉框QComboBox点击下拉时即更新下拉数据