Vue3中v-model在原生元素和自定义组件上的使用

目录

前言

一、原生元素上的用法

1. 输入框(input)

2. 多行文本域(textarea)

3. 单选按钮(radio)

4. 多选框(checkbox) 

5. 下拉选择框(select) 

二、自定义组件上的用法

1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件

2.使用一个可写的,同时具有 getter 和 setter 的 computed 属性

三、v-model修饰符

1. lazy 修饰符

2. number 修饰符

四、注意事项


前言

v-model 是 Vue 框架中用于实现双向数据绑定的指令之一,在 Vue 3 中保留了这一特性,并对其进行了一些改进。Vue 3 的 v-model 指令更加灵活,可以适用于原生 HTML 元素和自定义组件,并支持修饰符的使用。

一、原生元素上的用法

在 Vue 3 中,我们可以通过 v-model 在原生 HTML 元素上实现双向数据绑定。v-model 可以应用于 input、textarea 和 select 等表单元素。

1. 输入框(input)

在Vue 3中,可以通过v-model指令实现对输入框的双向绑定。

<template><div><input v-model="message" type="text"><p>Message: {{ message }}</p></div>
</template><script setup>
import { ref } from 'vue'const message = ref('')
</script>

2. 多行文本域(textarea)

<template><div><textarea v-model="message"></textarea><p>Message: {{ message }}</p></div>
</template><script setup>
import { ref } from 'vue'const message = ref('')
</script>

3. 单选按钮(radio)

 对于单选按钮,我们可以通过v-model指令绑定同一个name属性,将其与一个变量进行关联。

<template><div><input type="radio" id="option1" value="option1" v-model="selectedOption"><label for="option1">Option 1</label><input type="radio" id="option2" value="option2" v-model="selectedOption"><label for="option2">Option 2</label><p>Selected Option: {{ selectedOption }}</p></div>
</template><script setup>
import { ref } from 'vue'const selectedOption = ref('')
</script>

在上面的代码中,我们使用v-model指令绑定了两个单选按钮,并通过selectedOption变量进行双向数据绑定。用户选择其中一个选项时,selectedOption变量会更新,并且变化会实时反映在页面上。

4. 多选框(checkbox) 

<template><div><input type="checkbox" id="option1" value="option1" v-model="selectedOptions"><label for="option1">Option 1</label><input type="checkbox" id="option2" value="option2" v-model="selectedOptions"><label for="option2">Option 2</label><p>Selected Options: {{ selectedOptions }}</p></div>
</template><script setup>
import { ref } from 'vue'const selectedOptions = ref([])
</script>

在这个例子中,我们使用v-model指令绑定了两个多选框,并通过selectedOptions变量进行双向数据绑定。当用户选择或取消选择其中一个多选框时,selectedOptions变量会相应地更新,并且变化会实时反映在页面上。

注意:对于多选框,使用v-model进行绑定的变量应该是一个数组类型,用于保存选中的多个选项的值。

5. 下拉选择框(select) 

<template><div><select v-model="selectedOption"><option value="option1">Option 1</option><option value="option2">Option 2</option></select><p>Selected Option: {{ selectedOption }}</p></div>
</template><script setup>
import { ref } from 'vue'const selectedOption = ref('')
</script>

二、自定义组件上的用法

除了原生 HTML 元素,Vue 3 中的 v-model 还可以在自定义组件中使用。需要注意的是,自定义组件上使用v-model需要遵循一些规则。实现的方式有两种。

默认情况下,v-model 在组件上都是使用 modelValue 作为 prop,并以 update:modelValue 作为对应的事件。

1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件

父组件:v-model将message变量与该组件进行双向绑定

<template><div><child-component v-model="message"></child-component><p>父组件:Message: {{ message }}</p></div>
</template><script setup>import { ref } from 'vue'const message = ref('')
</script>

自定义组件:v-model默认绑定的不是value,而是modelValue。发射的方法固定位为@update:modelValue。

<template><div>子组件<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /></div>
</template><script setup>defineProps({modelValue: {type: String}})defineEmits(['update:modelValue'])
</script>

在自定义组件的模板中,我们使用:value来绑定输入框的值,并通过@input监听输入事件。同时,使用$emit函数触发update:modelValue事件,将输入框的新值传递给父组件。

通过使用props和事件,我们可以实现自定义组件上类似于原生表单元素的双向绑定效果。

 

2.使用一个可写的,同时具有 getter 和 setter 的 computed 属性

父组件:同上

自定义组件:get 方法需返回 modelValue prop,而 set 方法需触发相应的事件。

<template><div>子组件<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /></div>
</template><script setup>import { computed } from 'vue'const props = defineProps({modelValue: {type: String}})defineEmits(['update:modelValue'])computed({get() {return props.modelValue},set(value) {emit('update:modelValue', value)}})
</script>

三、v-model修饰符

除了基本的双向绑定外,Vue 3 的 v-model 还支持多种修饰符。常用的修饰符有 .lazy.number

1. lazy 修饰符

.lazy 修饰符可以使输入框的值在失去焦点时才进行更新。例如:

<template><div><input type="text" v-model.lazy="message"><p>{{ message }}</p></div>
</template><script setup>
import { ref } from 'vue'const message = ref('Hello, Vue 3!')</script>

2. number 修饰符

.number 修饰符可以将输入框的值转换为数值类型。例如:

<template><div><input type="text" v-model.number="count"><p>Count: {{ count }}</p></div>
</template><script setup>
import { ref } from 'vue'const count = ref(0)</script>

四、注意事项

1. 不是所有的原生元素都能直接使用 v-model。例如,<button> 元素不能直接使用 v-model 来实现双向绑定,但可以使用其他的事件和方法来进行状态管理和更新。

2. 在自定义组件中修改modelValue的值时,应当使用响应式的refreactive变量。

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

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

相关文章

网络编程 tcp udp http编程流程 网络基础知识

讲解 网络基础知识网络编程tcp编程流程图示理解bind和accept函数理解监视套接字和链接套接字理解linux和window下的编程实现tcp特点 udp编程流程图示理解udp特点 http编程流程图示理解编程实现-网站服务器 网络基础知识 OSI分层&#xff1a;应用层 表示层 会话层 传输层 网络层…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

【MongoDB】解决ProxmoxVE下CentOS7虚拟机安装MongoDB6后启动失败的问题

目录 安装步骤&#xff1a; 2.1 配置yum源 2.2 安装MongoDB 2.3 启 动MongoDB ProxmoxVE上新装的CentOS7.4虚拟机&#xff0c;安装MongoDB6。 安装步骤&#xff1a; 2.1 配置yum源 # 创建mongodb yum源&#xff08;https://www.mongodb.com/docs/manual/tutorial/insta…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

初次使用GPU云服务器

前言&#xff1a; 在体验了GPU云服务器&#xff08;GPU Cloud Computing&#xff0c;GPU&#xff09;后&#xff0c;我认为这是一个非常强大的弹性计算服务。它为深度学习、科学计算、图形可视化、视频处理等多种应用场景提供了强大的GPU算力&#xff0c;能够满足各类用户的计算…

【动态规划】数字三角形

算法提高课课堂笔记。 文章目录 摘花生题意思路代码 最低通行费题意思路代码 方格取数题意思路代码 摘花生 题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道…

UML—浅谈常用九种图

目录 概述: 1.用例图 2.静态图 3.行为图&#xff1a; 4.交互图&#xff1a; 5.实现图&#xff1a; 概述: UML的视图是由九种视图组成的&#xff0c;分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…

RocketMQ发送消息超时异常

说明&#xff1a;在使用RocketMQ发送消息时&#xff0c;出现下面这个异常&#xff08;org.springframework.messging.MessgingException&#xff1a;sendDefaultImpl call timeout……&#xff09;&#xff1b; 解决&#xff1a;修改RocketMQ中broke.conf配置&#xff0c;添加下…

枫叶时代:打造中国特色的传统文化IP

近年来&#xff0c;取材于传统文化的影视作品在文化产业市场受到前所未有的关注。作为一种兼具辨识度、影响力和流量变现能力的文化符号&#xff0c;影视IP既是文化产业的一个重要环节&#xff0c;也是国家文化软实力的直接体现。优秀的影视IP可以超越文字、语言、民族的障碍&a…

滑动窗口(全面清晰/Java)

数组模拟单调队列 分析 以k3举例&#xff1a; (1)利用单调队列的性质&#xff1a; <1>最小值&#xff1a;确保队列单调递增&#xff0c;处理后&#xff0c;队头即是最小值。 <2>最大值&#xff1a;确保队列单调递减&#xff0c;处理后&#xff0c;队头即是最大值…

做接口测试如何上次文件

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

yolov2检测网数据集标注_labelme使用_json2txt格式转换

yolov2检测网数据集标注_labelme使用_json2txt格式转换 一、安装Anaconda二、创建labelme虚拟环境三、使用labelme标注健康非健康猫狗数据3.1 打开数据集所在文件夹3.2 进行标注数据集3.3 json2txt3.4 按文件目录和训练测试数据集重分配 四、数据喂给服务器网络参考链接 一、安…

网络安全---正则回溯

目录 一、题目引入 二、举出回溯例子进行分析 第一步&#xff1a; 正则往前匹配 第二步&#xff1a;匹配到头 第三步&#xff1a;往回匹配 第四步&#xff1a;直到分号结束 &#xff08;匹配上&#xff09; 原因&#xff1a; 三、进入正题一&#xff08;分析题型&#x…

MongoDB创建用户 、数据库、索引等基础操作

MongoDB的权限认证是相对来说比较复杂的&#xff0c;不同的库创建后需要创建用户来管理。 本机中的MongoDB是docker 启动的&#xff0c;所以先进入docker的镜像中 docker exec -it mongodb bash 这样就进入到了镜像MongoDB中&#xff0c;然后输入命令连接MongoDB数据库 注…

有效管理IT问题的5个原则

问题管理就是发现未知的、隐藏的问题&#xff0c;这是根本原因&#xff0c; 这是您 IT 帮助台无穷无尽的工单来源。当您实施有效的 问题管理&#xff0c;您的 IT 团队可以超越消防模式&#xff0c;专注于战略 IT 目标。以下是可以帮助您实现一流问题管理的五个原则&#xff1a;…

网络安全 Day30-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

中介者模式(Mediator)

中介者模式是一种行为设计模式&#xff0c;可以减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个封装了对象间交互行为的中介者对象来进行合作&#xff0c;从而使对象间耦合松散&#xff0c;并可独立地改变它们之间的交互。中介者…

开源语言模型的历史和重要性;Edge浏览器将推出Bing AI重写文本功能

&#x1f989; AI新闻 &#x1f680; 微软即将推出桌面版Microsoft Edge浏览器的Bing AI重写文本功能 摘要&#xff1a;微软最近在桌面版Microsoft Edge浏览器中引入了一个新功能&#xff0c;允许用户使用Bing AI重写文本。用户可以选择不同的语气、格式和长度&#xff0c;然…

SpringMVC的架构有什么优势?——异常处理与文件上传(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…