首页 > 其他分享 >vue2如何父组件 对象 双向绑定子组件

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

时间:2024-05-31 10:03:47浏览次数:20  
标签:绑定 value vue2 组件 input 数据 localItem 属性

对于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应用中实现了数据的双向绑定。

 

标签:绑定,value,vue2,组件,input,数据,localItem,属性
From: https://blog.csdn.net/qq_46662528/article/details/139234742

相关文章

  • 总线系统:连接计算机组件的关键
    目录介绍概念和结构形态总线系统的分类和扩展总线接口并行接口串行接口接口类型比较总线仲裁集中式仲裁分布式仲裁混合式仲裁总线仲裁示例仲裁方法的比较总线的定时和数据传送模式定时信号数据传送模式总线系统的定时和数据传送模式比较实例分析PCI和PCI......
  • SwiftUI中AsyncImage的使用(一个高效的异步下载图片组件)
    iOS开发者经常会遇到需要在应用中显示网络图像的场景,无论是获取和显示用户头像,展示产品图像,等等。在原来的UIKit中,如果我们要用系统的API还是稍微有点麻烦,很多开发的朋友都选择了第三方的框架去处理网络图片的请求缓存等等。AsyncImage是SwiftUI中一个强大的功能,它简化了在......
  • MPI(二)- 进程调度,绑定
    单节点情况下不显式绑定CPU核心MPI运行时环境会依赖操作系统来管理MPI进程与CPU核心的映射和调度。操作系统会尝试均匀分配负载,但可能会出现缓存污染、上下文切换开销增加以及NUMA访问延迟等问题。默认调度操作系统的默认调度器会将进程分配到可用的CPU核心上,尝试均匀分......
  • 鸿蒙HarmonyOS实战-Web组件(页面跳转和浏览记录)
    ......
  • Avalonia下DataGrid多选MVVM绑定的功能
    安装Avalonia.Xaml.BehaviorsInstall-PackageAvalonia.Xaml.BehaviorsDataGridSelectedItemsBehavior.csusingAvalonia;usingAvalonia.Controls;usingAvalonia.Threading;usingAvalonia.Xaml.Interactivity;namespaceCgdataBase;publicclassDataGridSelected......
  • uniapp微信小程序使用瀑布流结合z-panging组件显示pexels的图片
    最终效果如下:  瀑布流组件用的:https://ext.dcloud.net.cn/plugin?id=7594下拉刷新组件用的:https://z-paging.zxlee.cn这两个搭配起来省了很多事z-paging中组合custom-waterfalls-flow,可下拉刷新、到底自动加载下一页。下拉刷新效果: 到底自动加载下一页效果: ......
  • 面试官:说说Netty的核心组件?
    Netty核心组件是指Netty在执行过程中所涉及到的重要概念,这些核心组件共同组成了Netty框架,使Netty框架能够正常的运行。Netty核心组件包含以下内容:启动器Bootstrap/ServerBootstrap事件循环器EventLoopGroup/EventLoop通道Channel通道处理器ChannelHandler通道......
  • 微信小程序之实现弹窗组件及点击弹窗按钮实现页面跳转
    创建一个名为PopupWindow的弹窗组件:   1、创建组件目录结构:    在项目的components目录下新建一个名为PopupWindow的文件夹,里面包含四个核心文件: PopupWindow.wxml 、PopupWindow.wxss、PopupWindow.js 、PopupWindow.json   2、编写组件文件......
  • Intel(R) Optane(TM) Memory and Storage Management Component 是一种软件组件,用于管
    Intel(R)Optane(TM)MemoryandStorageManagementComponent是一种软件组件,用于管理英特尔Optane存储技术。Optane技术是英特尔推出的一种新型存储技术,利用3DXPoint存储介质,具有极高的读写速度和低延迟,可用于加速系统的启动、应用程序加载和文件传输等操作。OptaneMem......
  • 绑定事件的方法有几种?
    在JavaScript中,绑定事件的方法主要有以下几种:1.HTML内联事件:直接在HTML元素中使用事件属性来绑定事件html<buttononclick="handleClick()">点击我</button><script>functionhandleClick(){alert('你点击了按钮!');}</script>2.DOM0级事件:通过JavaScript直接为元素......