[ Vue3 ] 三种方式实现组件数据双向绑定

Vue3 三种方式实现组件数据双向绑定

Vue 中,组件数据双向绑定是一项非常重要的特性,它使得我们能够轻松地在组件中处理数据的变化并将其同步到视图

比如我们想要在父组件中修改数据能够同步给子组件,并且子组件修改数据也能同步给父组件,使他们数据一方发生变化,则双方都发生改变。

实现组件数据双向绑定有三种写法分别是 常规写法v-modeldefineModel,下面给大家一一演示

常规写法

在点击父组件按钮时修改数据并同步给子组件

<script setup lang="ts">
import { ref } from 'vue';
import Hello from './components/Hello.vue';const data = ref("Hello World")// 通过调用该事件完成修改数据的操作
const changeData = (value: string) => {data.value = value
}
</script><template><h1>{{ data }}</h1><button @click="data = 'Hello Vue3'">修改子组件的数据</button><!-- 简写:<Hello :data="data" @update="data = $event" /> --><Hello :data="data" @update="changeData" />
</template>

点击子组件中的按钮触发父组件的自定义事件 update 绑定的 changeData 方法,并将参数 你好,世界! 传递给父组件的方法: changeData 从而实现更改父组件的数据

<script setup lang="ts">
const props = defineProps<{ data: string }>()
const emit = defineEmits<(e: "update", value: string) => void>()
</script><template><h1>{{ data }}</h1><button @click="emit('update', '你好, 世界!')">修改父组件的数据</button>
</template>

可以发现这种写法非常繁琐,子组件修改数据还要通过触发事件来完成

v-model

Vue3 中,使用 v-model 指令来实现组件数据的双向绑定非常简单。我们可以在组件中使用 v-model 指令来绑定一个值,并且在组件内部可以直接操作这个值。

接下来这种写法才是 Vue 主流的方式:

<script setup lang="ts">
import { ref } from 'vue';
import Hello from './components/Hello.vue';const data = ref("Hello World")
</script><template><h1>{{ data }}</h1><button @click="data = 'Hello Vue3'">修改子组件的数据</button><!-- 核心代码 --><Hello v-model="data" />
</template>
  1. 在子组件中我们将数据以 modelValue 命名来接收(固定命名)

  2. defineEmits 定义一个修改数据的事件:(e: "update:modelValue", value: string) => void

  3. 通过触发 emit('update:modelValue', '你好, 世界!') 来实现数据的更新操作

<script setup lang="ts">
const props = defineProps<{ modelValue: string }>()
const emit = defineEmits<(e: "update:modelValue", value: string) => void>()
</script><template><h1>{{ modelValue }}</h1><button @click="emit('update:modelValue', '你好, 世界!')">修改父组件的数据</button>
</template>

接下来想必大家就会有疑惑了,如果是多个数据需要双向绑定该怎么做呢?其实也很简单:

<script setup lang="ts">
import { ref } from 'vue';
import Hello from './components/Hello.vue';const data1 = ref("Hello World")
const data2 = ref("Hello World")
</script><template><h1>{{ data1 }}</h1><h1>{{ data2 }}</h1><button @click="data1 = 'Hello Vue3'">修改子组件的数据</button><button @click="data2 = 'Hello TypeScript'">修改子组件的数据</button><!-- 核心代码 --><Hello v-model:data1="data1" v-model:data2="data2" />
</template>
<script setup lang="ts">
const props = defineProps<{ data1: string, data2: string }>()
const emit = defineEmits<{ (e: "update:data1", value: string): void, (e: "update:data2", value: string): void }>()
</script><template><h1>{{ data1 }}</h1><h1>{{ data2 }}</h1><button @click="emit('update:data1', '你好, 世界!')">修改父组件的数据</button><button @click="emit('update:data2', '你好, 世界!')">修改父组件的数据</button>
</template>

对比一下常规的写法,可以发现不必再通过手动绑定事件就可以达到双向绑定的需求。

而常规写法其实就是这种写法的实现原理

defineModel

学习了上述两种写法后,接下来这种写法你一定会爱不释手,话不多说直接代码演示:

<script setup lang="ts">
import { ref } from 'vue';
import Hello from './components/Hello.vue';const data = ref("Hello World")
</script><template><h1>{{ data }}</h1><button @click="data = 'Hello Vue3'">修改子组件的数据</button><!-- 核心代码 --><Hello v-model="data" />
</template>
<script setup lang="ts">
import { defineModel } from 'vue'
const modelValue = defineModel()
</script><template><h1>{{ modelValue }}</h1><button @click="modelValue = '你好, 世界!'">修改父组件的数据</button>
</template>

当然,如果想要实现多个双向数据绑定可以这么做:

<script setup lang="ts">
import { ref } from 'vue';
import Hello from './components/Hello.vue';const data1 = ref("Hello World")
const data2 = ref("Hello World")
</script><template><h1>{{ data1 }}</h1><h1>{{ data2 }}</h1><button @click="data1 = 'Hello Vue3'">修改子组件的数据</button><button @click="data2 = 'Hello TypeScript'">修改子组件的数据</button><!-- 核心代码 --><Hello v-model:data1="data1" v-model:data2="data2" />
</template>
<script setup lang="ts">
import { defineModel } from 'vue'
const data1 = defineModel("data1")
const data2 = defineModel("data2")
</script><template><h1>{{ data1 }}</h1><h1>{{ data2 }}</h1><button @click="data1 = '你好, 世界!'">修改父组件的数据</button><button @click="data2 = '你好, 世界!'">修改父组件的数据</button>
</template>

使用该语法糖可以直接调用 defineModel 拿到父组件传递的数据,不需要再使用 defineEmitsdefineProps 就可以操作数据,告别繁琐的组件双向数据绑定。

注意: 该方式仅支持 Vue3.2.0 及以上版本

目前该方式处于Vue官方实验阶段,所以在控制台会出现以下警告:

defineModel() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect

解决它的办法也很简单,在 vite.config.ts 文件中配置如下代码即可:

export default defineConfig({plugins: [// 核心代码vue({script: {defineModel: true,},}),]
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/204646.html

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

相关文章

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO&#xff0c;如下死 GPIO 2 在前端的…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一&#xff0c;它对…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言&#xff1a; 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用&#xff0c;以其沉浸式、交互式的特点&#xff0c;正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

Elasticsearch(一)

一&#xff1a;简介 The Elastic Stack, 包括 Elasticsearch、 Kibana&#xff08;展示数据的项目&#xff09;、 Beats 和 Logstash&#xff08;这两个是采集和传输数据的项目&#xff09; 这些项目组合形成的技术栈称为ELK Stack&#xff0c;能够安全可靠地获取任何来源、任…

Vue框架学习笔记——键盘事件

文章目录 前文提要键盘事件&#xff08;并不是所有按键都能绑定键盘事件&#xff09;常用的按键不同的tab和四个按键keyCode绑定键盘事件&#xff08;不推荐&#xff09;Vue.config.keyCode.自定义键名 键码 神奇的猜想div标签和click.enterbutton标签和click.enter 前文提要 …

Cesium 展示——地球以及渲染数据导出(下载)为图片或 pdf

文章目录 需求分析新加需求分析第一种方式第二种方式需求 将 Cesium 球体以及渲染数据导出为 jpg/png/pdf 分析 获取场景 scene 信息,转为image 的 octet-stream 流 进行下载为图片 /*** @todo canvas 导出图片* @param {string} dataurl - 地址* @return {Blob}*/ functio…

额,收到阿里云给的赔偿了!

众所周知&#xff0c;就在刚过去不久的11月12号&#xff0c;阿里云突发了一次大规模故障&#xff0c;影响甚广。 以至于连咱们这里评论区小伙伴学校的洗衣机都崩了&#xff08;手动doge&#xff09;。 这么关键的双11节点&#xff0c;这么多热门业务和产品&#xff0c;这么大规…

平凯星辰携手教育部教育管理信息中心,助力普惠教育数字化

近日&#xff0c;企业级开源分布式数据库厂商平凯星辰与教育部教育管理信息中心达成合作&#xff0c;TiDB 分布式数据库为全国中小学管理服务平台提供全栈服务。双方将携手深入探索领先的数据库技术在教育行业的新场景与新应用&#xff0c;既夯实教育数字化底座&#xff0c;助力…

DS八大排序之直接插入排序和希尔排序

前言 我们前面几期介绍了线性和非线性的基本数据结构。例如顺序表、链表、栈和队列、二叉树等~&#xff01;本期和接下来的几期我们来详解介绍各个排序的概念、实现以及性能分析&#xff01; 本期内容 排序的概念以及其运用 常见的排序算法 直接插入排序 希尔排序 一、排序的…

Zabbix 6 详细安装部署教程

目录 一、安装 MySQL 数据库 二、安装 zabbix 监控平台 三、编辑配置文件 四、启动服务 五、zabbix-web 安装 zabbix web 出图展示乱码问题解决方案 zabbix 的安装部署非常简单&#xff0c;官方提供了四种安装途径&#xff0c;分别是二进制 rpm 包安装方式、源码安装方…

jetson nano 串口通信

目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…

西南科技大学信号与系统A实验三(线性连续时间系统的分析)

一、实验目的 1.掌握用 matlab 分析系统时间响应的方法 2.掌握用 matlab 分析系统频率响应的方法 3.掌握系统零、极点分布与系统稳定性关系 二、实验原理 1. 系统函数 H(s) 系统函数:系统零状态响应的拉氏变换与激励的拉氏变换之比. H(s)=R(s)/E(s) 在 matlab 中可采用…

ddns-go部署在linux虚拟机

ddns-go部署ubuntu1804 1.二进制部署 1.虚拟机部署 1.下载linux的x86二进制包 wget https://github.com/jeessy2/ddns-go/releases/download/v5.6.3/ddns-go_5.6.3_linux_x86_64.tar.gz2.解压 tar -xzf ddns-go_5.6.3_linux_x86_64.tar.gz3.拷贝执行文件到PATH下&#xff0c…

【前端】浅谈async/await异步传染性

文章目录 概述观点无法解决可以解决 来源 概述 "异步传染性"问题通常是指&#xff0c;当一个函数使用了async和await&#xff0c;其调用者也需要使用async和await处理异步操作&#xff0c;导致整个调用链都变成异步的。这种情况可能导致代码变得更复杂&#xff0c;不…

全网日志智能聚合及问题根因分析

1 日志关联分析的挑战 随着各行各业数字化转型的不断深入&#xff0c;网络承载了人们日常生活所需的政务、金融、娱乐等多方面的业务系统&#xff0c;已经成为影响社会稳定运行、关系国计民生的重要基础设施资源。哪怕网络发生及其微小的故障&#xff0c;也可能带来难以估量的…

基于C#实现十字链表

上一篇我们看了矩阵的顺序存储&#xff0c;这篇我们再看看一种链式存储方法“十字链表”&#xff0c;当然目的都是一样&#xff0c;压缩空间。 一、概念 既然要用链表节点来模拟矩阵中的非零元素&#xff0c;肯定需要如下 5 个元素(row,col,val,down,right)&#xff0c;其中&…

C语言第三十六弹--实现转移表的多种方法

使用C语言通过多种方法实现转移表 方法一、普通法 思路&#xff1a;如图实现多种操作&#xff0c;首先创建菜单&#xff0c;需要运行一次再判断条件&#xff0c;所以通过do{}while(); 循环来实现多次。有多种选择&#xff0c;使用switch case选择语句&#xff0c;再在对应case…

SpectralGPT: Spectral Foundation Model 论文翻译2

遥感领域的通用大模型 2023.11.13在CVPR发表 原文地址&#xff1a;[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) 实验 ​ 在本节中&#xff0c;我们将严格评估我们的SpectralGPT模型的性能&#xff0c;并对其进行基准测试SOTA基础模型&#xff1a;ResN…

【沁恒蓝牙mesh】CH58x 将RTC时钟切换为LSE外部低速时钟

本文主要记录了【沁恒蓝牙mesh】CH58x 如何将RTC时钟切换为外部时钟 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&#x1f525;&#x1f389;…

【代码】基于卷积神经网络(CNN)-支持向量机(SVM)的分类预测算法

程序名称&#xff1a;基于卷积神经网络&#xff08;CNN&#xff09;-支持向量机&#xff08;SVM&#xff09;的分类预测算法 实现平台&#xff1a;matlab 代码简介&#xff1a;CNN-SVM是一种常用的图像分类方法&#xff0c;结合了卷积神经网络&#xff08;CNN&#xff09;和支…