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

news2024/11/19 23:41:39

目录

前言

一、原生元素上的用法

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.coloradmin.cn/o/851764.html

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

相关文章

岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测

岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测 桥梁作为交通运输的重要节点&#xff0c;其安全性一直备受关注。不同于其他建筑物&#xff0c;桥梁所处的环境复杂多变&#xff0c;同时&#xff0c;其所需承受的负荷也相对较大&#xff0c;这就需要对桥梁的安全进…

关于eclipse导入部署具有增删改查的项目

目录 前言&#xff1a;当我们刚刚进入公司的第一步就是去部署当前公司的项目&#xff0c;本博客就是详细介绍怎么去部署当前公司的项目。 一&#xff0c;开发工具&#xff1a; 二&#xff0c;具体步骤&#xff1a; 2.1导入公司的项目 打开eclipse开发工具 2.2配置当前的环…

windows 10 远程桌面配置

1. 修改远程桌面端口&#xff08;3389&#xff09; 打开注册表&#xff08;winr&#xff09;, 输入regedit 找到配置项【计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp】 &#xff0c; 可以通过搜索“Wds”快速定位。 修改端口配…

Linux线程同步(条件变量)

文章目录 前言一、条件变量概念二、条件变量相关的函数三、条件变量模拟生产者消费者模型四、使用条件变量的好处总结 前言 本篇文章来讲解一下条件变量的使用。 一、条件变量概念 条件变量&#xff08;Condition Variable&#xff09;是并发编程中一种线程同步机制&#xf…

解决阿里图标引入彩色图标却是黑色的问题

解决阿里图标引入彩色图标却是黑色的问题 下载symbol文件&#xff0c; 引入这些文件&#xff1a; 使用&#xff1a; <svg class"icon" aria-hidden"true"><use xlink:href"#icon-图标名称"></use></svg>.icon {width: …

Flowable-结束事件-取消结束事件

目录 定义图形标记XML内容使用示例视频教程 定义 取消结束事件只能与 BPMN 事务子流程结合使用&#xff0c;它可以取消一个事务子流程的执行&#xff0c;同时 也只能在子流程中执行。实际应用中&#xff0c;会把取消事件&#xff0c;事务子流程&#xff0c;补偿事件一起用。当…

实例033 制作闪烁的窗体

实例说明 Windows系统中&#xff0c;当程序在后台运行时&#xff0c;如果某个窗口的提示信息需要用户浏览&#xff0c;该窗口就会不停的闪烁&#xff0c;这样就会吸引用户的注意。同样&#xff0c;如果在自己的程序中使某个窗口不停的闪烁就会吸引用户的注意。本例设计了一个闪…

adb用法,安卓的用户CA证书放到系统CA证书下

设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01; ​​​​​​​测试环境&#xff1a;redmi 5 plus、miui10 9.9.2dev&#xff08;安卓8.1&#xff09;、已root win下安装手机USB驱动&#xff08;过程略&#xff0c…

图像的转置之c++实现(qt + 不调包)

1.基本原理 图像的转置就是将图像的横坐标和纵坐标交换位置&#xff0c;和矩阵的转置是一样的&#xff0c;公式见下&#xff1a; 2.代码实现&#xff08;代码是我以前自学图像处理时写的&#xff0c;代码很粗糙没做任何优化&#xff0c;但很好理解&#xff09; /*图像的转置函…

无涯教程-Perl - getc函数

描述 此函数从FILEHANDLE中读取下一个字符(如果未指定,则从STDIN中读取),并返回值。 语法 以下是此函数的简单语法- getc FILEHANDLEgetc返回值 此函数返回错误或文件结尾的undef以及从FILEHANDLE读取的字符值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$k…

APT80DQ20BG-ASEMI快恢复二极管80A 200V

编辑&#xff1a;ll APT80DQ20BG-ASEMI快恢复二极管80A 200V 型号&#xff1a;APT80DQ20BG 品牌&#xff1a;ASEMI 芯片个数&#xff1a;双芯片 封装&#xff1a;TO-3P 恢复时间&#xff1a;≤50ns 工作温度&#xff1a;-55C~150C 浪涌电流&#xff1a;600A*2 正向电流…

解析Java中的包装类和泛型

Java中的包装类和泛型 一、包装类与基本类型二、泛型1、什么是泛型2、引出泛型3、泛型类的定义和使用4、擦除机制5、泛型的上界6、泛型方法7、通配符 总结 一、包装类与基本类型 包装类&#xff0c;就是基本数据类型对应的类类型。我们已知Java中有8种基本数据类型&#xff0c…

算法与数据结构(二十二)动态规划解题套路框架

动态规划解题套路框架 此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 动态规划问题&#xff08;Dynamic Programming&#xff09;应该是很多读者头疼的&#xff0c;不过这类问题也是最具有技巧性&#xff0c…

BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)

一、介绍 BurpSuite是渗透测试、漏洞挖掘以及Web应用程序测试的最佳工具之一&#xff0c;是一款用于攻击web 应用程序的集成攻击测试平台&#xff0c;可以进行抓包、重放、爆破&#xff0c;包含许多工具&#xff0c;能处理对应的HTTP消息、持久性、认证、代理、日志、警报。 二…

港科夜闻|追求卓越教学奖颁奖典礼成功举办,两位香港科大教授获表彰

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、2022年度追求卓越教学奖颁奖典礼于近日成功举办&#xff0c;两位香港科大教授获表彰。香港科大社会科学学部王家礼教授获得“追求卓越教学奖(The Common Core Teaching Excellence Award)”&#xff0c;香港科大公共政策…

Python小白入门:关于函数的超详解知识点总结(定义、传递参数、返回值、模块等)

本文目录 一、定义函数二、传递实参2.1 位置实参2.2 关键字参数2.3 默认值练习题代码输出 三、返回值3.1 返回简单值3.2 可选实参3.3 返回字典3.4 在函数中使用while循环练习题代码输出 四、传递列表4.1 在函数中修改列表4.2 禁止函数修改列表练习题代码输出 五、传递任意数量的…

【Linux】常用的文本处理命令详解 + 实例 [⭐实操常用,建议收藏!!⭐]

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块6

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Positive证书是什么?

Positive SSL是全球著名CA Sectigo的子品牌&#xff0c; 也是目前全球签发量最高的商业SSL证书。价格低&#xff0c;安全性高&#xff0c;在个人网站和中小型企业网站中拥有极高的占有率。 Positive SSL证书包括DV SSL&#xff0c; EV SSL&#xff0c;也是唯一支持IP地址加密的…