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.mzph.cn/news/843096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的多线程

第1章&#xff1a;多线程基础 线程的定义和作用 线程是操作系统能够进行运算调度的最小单位。它允许程序在执行过程中同时执行多个任务&#xff0c;提高程序的执行效率。 线程与进程的区别 进程是资源分配的最小单位&#xff0c;而线程是程序执行的最小单位。一个进程可以包…

决策树算法实战

本实战主要目标是讲解如何使用sklearn库来构造决策树&#xff0c;包括其中的一些参数的使用&#xff0c;以及参数调优对模型精确度的影响。 1. 数据处理 导入Pandas和Matplotlib两个库。 # 导入Pandas和Matplotlib两个库 %matplotlib inline import matplotlib.pyplot as pl…

动态规划part02 Day42

LC62不同路径 LC63不同路径II(超时10min) 超时原因分析&#xff1a;思路想错了&#xff0c;即便是正确思路初始化也有点问题&#xff0c;应该将不必要的判断逻辑引入初始化的过程中初始化&#xff1a; 从左上角到[i][0]和[0][j]都只有一条路径dp[i][0]1和dp[0][j]1引入故障&am…

URL跳转

1.URL介绍 开放重定向&#xff08;Open Redirect&#xff09;&#xff0c;也叫URL跳转漏洞&#xff0c;是指服务端未对传入的跳转url变量进行检查和控制&#xff0c;导致诱导用户跳转到恶意网站&#xff0c;由于是从可信的站点跳转出去的&#xff0c;用户会比较信任。 2.URL跳…

监控云安全的9个方法和措施

如今&#xff0c;很多企业致力于提高云计算安全指标的可见性&#xff0c;这是由于云计算的安全性与本地部署的安全性根本不同&#xff0c;并且随着企业将应用程序、服务和数据移动到新环境&#xff0c;需要不同的实践。检测云的云检测就显得极其重要。 如今&#xff0c;很多企业…

公司预防文件泄密的常见手段 | 文件防泄密软件推荐排行榜

在当今信息化社会&#xff0c;企业面临着越来越多的文件泄密风险。为了保护企业的核心信息和资产&#xff0c;公司需要采取一系列手段来预防文件泄密。本文将介绍公司预防文件泄密的常见手段&#xff0c;并推荐五款优秀的防泄密软件&#xff0c;帮助企业构建更为严密的数据安全…

【Umi】umi-max 中使用 Dva

前置介绍 Umi 是一个基于 React 的可插拔企业级前端应用框架&#xff0c;Umi 提供了一系列的插件和约定&#xff0c;使得开发者能够以约定大于配置的方式进行开发&#xff0c;同时还支持丰富的功能扩展和插件机制。 Dva 是一个基于 Redux、Redux-Saga 和 React-Router 的数据…

ArcGIS中离线发布路径分析服务,并实现小车根据路径进行运动

ArcGIS中离线发布路径分析服务&#xff0c;您可以按照以下步骤操作&#xff1a; 准备ArcMap项目&#xff1a; 打开ArcMap并加载包含网络分析图层的项目。在ArcMap中&#xff0c;使用 Network Analyst Toolbar 或 Catalog 创建网络数据集&#xff08;Network Dataset&#xff09…

Unity3D 主城角色动画控制与消息触发详解

前言 在游戏开发中&#xff0c;角色动画控制和消息触发是非常重要的一部分&#xff0c;它可以让游戏更加生动和互动。本文将详细介绍如何在Unity3D中实现主城角色动画控制与消息触发。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;大家可以点击进来一起交流一下开…

二零二四充能必读 | 618火热来袭,编程书单助你提升代码力

文章目录 &#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智慧的结晶&#x1f31f; 代码效率的提升 亲爱的…

Kubernetes 之 ReplicaSet

Kubernetes 之 ReplicaSet ReplicaSet 定义 ReplicaSet 是 Kubernetes 中的一种副本控制器&#xff0c;其主要作用是控制其管理的 Pod 的预设副本数量。它会持续监听这些 Pod 的运行状态&#xff0c;在Pod发生故障时执行重启策略&#xff0c;当 Pod 数量减少时会重新启动新的…

VUE3+TS+elementplus+Django+MySQL实现从数据库读取数据,显示在前端界面上

一、前言 前面通过VUE3和elementplus创建了一个table&#xff0c;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff0c;以及使用VUE3TSelementplus创建一个增加按钮&#xff0c;使用前端的静态数据&#xff0c;显示在表格中。今天通过从后端获取数据来显示在表格…

okcc呼叫中心系统TTS语音群呼功能如何使用?

OKCC呼叫中心的TTS语音群呼功能允许用户通过文本输入创建自动语音呼叫&#xff0c;系统会将文本转换为语音&#xff0c;然后自动拨打给目标客户群体。使用此功能通常遵循以下步骤&#xff1a; 编写脚本&#xff1a;首先&#xff0c;需要编写一个语音消息的脚本&#xff0c;这通…

学习信号和槽(1)

信号和槽函数 一、了解信号和槽的概念二、信号和槽的使用2.1、第一种方法2.2、第二种方法2.3、第三种方法2.4、第四种方法2.5、第五种方法 一、了解信号和槽的概念 信号&#xff08;Signal&#xff09;&#xff1a;就是在特定条件下被发射的事件&#xff0c;比如QPushButton 最…

Flutter 中的 Opacity 小部件:全面指南

Flutter 中的 Opacity 小部件&#xff1a;全面指南 在Flutter中&#xff0c;动画和视觉效果是提升用户体验的重要手段。Opacity小部件允许你改变子组件的透明度&#xff0c;从而实现淡入、淡出或其它透明度相关的动画效果。本文将提供Opacity的全面指南&#xff0c;帮助你了解…

linux 查看 线程名, 线程数

ps -T -p 3652 ps H -T <PID> ps -eLf | grep process_name top -H -p <pid> 查看进程创建的所有线程_ps 显示一个进程的所有线程名字-CSDN博客

美国西储大学(CRWU)轴承故障诊断——连续小波(CWT)变换

1.数据集介绍 2.代码 import random import matplotlib matplotlib.use(Agg) from scipy.io import loadmat import numpy as npdef split(DATA):step = 400;size = 1024;data = []for i in range(1, len(DATA) - size, step):data1 = DATA[i:i + size]data.append(data1)rand…

【渗透基础】windows登录的明文密码

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 在这个过程中&#xff0c;明文密码只会在用户输入时短暂存在于内存中&#xff0c;随后立即被加密并丢弃&#xff0c;以确保密…

前端大屏幕开发注意点

前端大屏幕&#xff08;如数据展示大屏、监控面板等&#xff09;的开发有其特定的挑战和考虑要点&#xff0c;以确保内容在高分辨率、大尺寸显示设备上能够清晰、美观且高效地展示。以下是一些关键的注意点&#xff1a; 响应式设计&#xff1a;虽然大屏幕不像移动设备那样面临多…

内网穿透初步探索实践

内网穿透初步 正常来说两台Linux设备只有在同一局域网下才可以进行互相的ssh远程登录 那么如果不在一个网段下&#xff0c;比方说一台在家里连着家里的WIFI&#xff0c;一台在学校连着实验室的WIFI&#xff0c;这种情况要想实现ssh远程登录则需要用到内网穿透 这就需要用到一…