vue2 与 vue3 实现自定义组件v-model双向数据绑定的方式

前言

有时候我们需要对一个组件绑定自定义 v-model,以更方便地实现双向数据

甚至有时候,我们想要实现绑定多个 “v-model”,也就是多个“双向绑定”,好在 vue 3 已经实现了可使用多个 v-model

例如:

自定义表单输入控件

弹窗封装组件,控制展示与隐藏

vue2

单个“双向绑定”的实现

其实 v-model 本质就是 value + change 的语法糖,监听传入内容并触发改变,因此只要实现 “监听” + “触发” 就可以实现自定义 v-model

<!-- 父组件 -->
<template><Child v-model="parentValue" />
</template>
<script>
import Child from './components/child.vue'
export default {name: 'ParentComponent',components: {Child,},data() {return {parentValue: '', // 父组件数据}},
}
</script>
<style scoped lang="scss"></style>
<!-- 子组件 -->
<template><input v-model="getValue" />
</template>
<script>
export default {name: 'ChildComponent',props: {childValue: String,},model: {prop: 'childValue', // 指定 v-model 要绑定的参数叫什么名字,来自于 props 中定义的参数event: 'updateValue', // 指定要触发的事件名字,将被用于 $emit},computed: {getValue: {// 这里的计算属性使用了 getter、setter,可以简化代码// 可参见链接 https://cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7%E7%9A%84-setterget() {return this.childValue},set(val) {this.$emit('updateValue', val) // 触发},},},
}
</script>
<style scoped lang="scss"></style>

通过这样的方式,我们就实现了自定义组件的 v-model,重点在于子组件中 model 的声明和 emit 事件

vue3 

vue2 中的 v-model 和 .sync 功能重叠,容易混淆,因此 vue3 做了统一,一个组件可以多次使用 v-model

注意:

vue3 移除了 model 选项,就是上面示例 vue2 中的用法

model: {

    prop: '', // 指定 v-model 要绑定的参数叫什么名字,来自于 props 中定义的参数

    event: '', // 指定要触发的事件名字,将被用于 $emit

}

单个数据双向绑定 

<!-- 父组件 -->
<template><Child v-model="parentValue" />
</template>
<script setup name='ParentComponent' lang="ts">
import Child from './components/child.vue'import { ref } from 'vue';const parentValue = ref('')
</script>
<style scoped lang="scss"></style>
<!-- 子组件 -->
<template><input v-model="getValue" />
</template>
<script setup name='ChildComponent' lang="ts">
import { ref, computed, defineEmits, defineProps } from 'vue'const props = defineProps({modelValue: {type: String,default: '',},
})const emit = defineEmits(['update:modelValue'])const getValue = computed({get() {return props.modelValue},set(newValue) {emit('update:modelValue', newValue)},
})
</script>
<style scoped lang="scss"></style>

vue3 使用特定的 modelValue ,避免 value 的占用,通过 update:modelValue 实现数据双向绑定

 多个数据双向绑定

<!-- 父组件 -->
<template><Child v-model:name="parentName" v-model:age="parentAge" />
</template>
<script setup name='ParentComponent' lang="ts">
import Child from './components/child.vue'import { ref } from 'vue'const parentName = ref('')
const parentAge = ref('')
</script>
<style scoped lang="scss"></style>
<!-- 子组件 -->
<template><input v-model="getNameValue" /><input v-model="getAgeValue" />
</template>
<script setup name='ChildComponent' lang="ts">
import { ref, computed, defineEmits, defineProps } from 'vue'const props = defineProps({name: {type: String,default: '',},age: {type: String,default: '',},
})const emit = defineEmits(['update:name','update:age'])const getNameValue = computed({get() {return props.name},set(newValue) {emit('update:name', newValue)},
})const getAgeValue = computed({get() {return props.age},set(newValue) {emit('update:age', newValue)},
})
</script>
<style scoped lang="scss"></style>

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

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

相关文章

OpenEuler校正时间、OpenEuler设置时间

[rootlocalhost ~]# timedatectl set-time "2024-01-16 12:21:15" Failed to set time: Automatic time synchronization is enabled 断网情况下设置OpenEuler的时间&#xff0c;直接执行timedatectl set-time "2024-01-16 12:21:15"是报错的&#xff0c;…

day18 找树左下角的值 路径总和 路径总和Ⅱ 从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树

题目1&#xff1a;513 找树左下角的值 题目链接&#xff1a;513 找树左下角的值 题意 找出二叉树的最底层 最左边节点的值 (假设二叉树中至少有1个节点) 最底层节点确保是深度最大的叶子节点&#xff0c;最左边的节点却不一定是左孩子 递归遍历 深度最大的叶子节点最…

docker使用nginx部署vue刷新页面404

docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的&#xff0c;但是刷新页面之后就显示404&#xff0c;关键是我两个前端项目都是用的这一个配置文件&#xff0c;但是只有一个项目出现刷新浏览器显示404的问题&#xff0c;这给我搞懵了&#xff01;&…

【dayjs】类型“Dayjs”上不存在属性“isSameOrAfter”

dayjs中有一些方法是需要使用插件后才能使用&#xff0c;默认情况下&#xff0c;Day.js只提供核心代码&#xff0c;没有安装插件。 解决方法&#xff1a; import dayjs from dayjs;import isSameOrAfter from dayjs/plugin/isSameOrAfter;dayjs.extend(isSameOrAfter);再次使…

AI嵌入式K210项目(5)-串口通讯

文章目录 前言一、什么是UART&#xff1f;二、K210的UART三、实验过程总结 前言 串口通讯是平时大家进行调试最常用的方法&#xff0c;嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求&#xff0c;它能够灵活地…

odoo16 权限继承修改字段显示2

odoo16 权限继承修改字段显示2 上次文章写道:最近在搭建的一个服装批发中心使用的进销存一体化项目,由于客户文化水平低,不想在发货界面显示 好多无用功能,有些是有用的,有些是他不关心的。占在用户角度考虑,用不到的功能都是垃圾。有他们的道理。在隐藏的过程中,出现了…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】

A-B 数对(洛谷)

A-B 数对 题目背景 出题是一件痛苦的事情&#xff01; 相同的题目看多了也会有审美疲劳&#xff0c;于是我舍弃了大家所熟悉的 AB Problem&#xff0c;改用 A-B 了哈哈&#xff01; 题目描述 给出一串正整数数列以及一个正整数 C&#xff0c;要求计算出所有满足 A - B C 的数…

运筹说 第90期 | 网络计划-图解评审法

前述章节的网络计划方法主要研究以时间为主要参数的确定型网络模型&#xff0c;其中的概率型网络模型也只讨论工作公式的不确定性&#xff0c;并没有对事项或工作的不确定性进行讨论。由于这类网络模型的建立有严格的规则&#xff0c;大量研究与开发类计划尚无法表达。因从本期…

vue中el-radio无法默认选中

页面上不生效&#xff0c;默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…

污水处理厂能耗分析系统,高效节能保护环境的利器

在城市化发展中&#xff0c;水污染问题也愈发凸显&#xff0c;在污水处理过程中&#xff0c;所产生的能源相对较多&#xff0c;企能源消耗的量就比较大&#xff0c;所以成本就会较高。因此&#xff0c;应对污水处理的具体情况需要进行深入分析与研究&#xff0c;明确具体消耗情…

Lamp架构从入门到精通

系列文章目录 lnmp架构 lnmp架构-nginx负载均衡以及高可用 系列文章目录一、源码编译configure(检测预编译环境是否可行)makemake install优化关闭Debug 二、 nginx负载均衡三、nginx的高并发nginx work数量的设定nginx work进程与cpu的静态绑定压力测试nginx高并发修改操作系…

使用 Apache POI XDGF 读取 vsdx 文件

引入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.22.1</version> </dependency> <dependency><groupId>org.apache.logging.log4j</groupI…

org.openjdk.jmh 的 pom 引用

<dependencies><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.29</version></dependency> </dependencies>这将从 Maven 中央存储库下载 org.openjdk.jmh 依赖项的…

Spring AOP 源码分析

【阅读前提】&#xff1a; 需了解AOP注解开发流程&#xff1a;链接 一、注解 EnableAspectJAutoProxy 在配置类中添加注解EnableAspectJAutoProxy&#xff0c;便开启了AOP&#xff08;面向切面编程&#xff09; 功能。此注解也是了解AOP源码的入口。 EnableAspectJAutoProxy…

训练营第四十九天 | ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 持有&#xff1a;第i-1天持有&#xff1b;第i天买入 不持有&#xff1a;第i-1天不持有&#xff1b;第i天卖出 代码随想录 class Solution {public int maxProfit(int[] prices) {//动态规划if(prices null || prices.length 0) return 0;int n pri…

编码技巧:如何在Golang中高效解析和生成XML

编码技巧&#xff1a;如何在Golang中高效解析和生成XML 引言Golang中的XML基础解析XML文件生成XML文件错误处理和调试高级技巧和最佳实践总结 引言 在当今数据驱动的编程世界中&#xff0c;有效地处理各种数据格式是每个开发人员必备的技能之一。其中&#xff0c;XML&#xff…

【人工智能:现代方法】第19章:样例学习

智能体学习&#xff08;learning&#xff09;&#xff1a;一个智能体通过对世界进行观测来提高它的性能机器学习&#xff08;machine learning&#xff09;&#xff1a;智能体是一台计算机 —— 一台计算机观测到一些数据&#xff0c;基于这些数据构建一个模型&#xff08;mode…

并发编程之三大特性及JMM内存模型

目录 原子性 如何保证原子性 可见性 如何保证可见性 有序性 如何保证有序性 Java内存模型(JMM内存模型) Java内存模型的一些关键概念&#xff1a; 主内存与工作内存交互协议 Java内存模型通过以下手段来确保多线程程序的正确性&#xff1a; 锁机制 volatile volat…

说说JavaScript数字精度丢失的问题,如何解决?

在 JavaScript 中&#xff0c;数字精度丢失是一种普遍的问题。这是因为 JavaScript 内部的数字均以 IEEE 754 标准的双精度浮点数格式存储&#xff0c;这种格式只能精确表示有限个小数&#xff0c;而对于一些无限循环小数或无理数&#xff0c;无法精确表示&#xff0c;就会出现…