组件v-model

最近看到vue版本更新到3.4.x了,其中有个defineModel API,defineModel在3.3的时候是作为实验特性发布的,在3.4中逐渐稳定。这个API就是Vue3简化组件v-model的写法的,所以这篇就一块儿来总结一下vue中的组件v-model

官网的示例

 先说下vue2中的使用,再说下vue3中的使用

V2 

单个v-model绑定

下面这个单个v-model中,默认是向子组件传递的value属性,子组件接受value获取到父组件的值,通过$emit发送input事件更新该值。也可以通过配置model修改接受的字段名称和事件名称,具体看如下代码

父组件示例: 

<template><div class="mytest"><div>父组件的name:{{ name }}</div><Child v-model="name" /></div>
</template>
<script>
import Child from './child.vue'
export default {data() {return {name: 'WFT'}},components: { Child }
}
</script>

 子组件示例: 

<template><div class="child"><div>我是子组件</div><el-input v-model="name" placeholder="请输入内容"></el-input></div>
</template>
<script>
export default {model: {prop: 'value', // 默认就是valueevent: 'input' // 默认就是input},props: {value: {type: String,default: ''}},computed: {name: {get() {return this.value},set(val) {this.$emit('input', val)}}}
}
</script>

多个v-model绑定 

多个v-model绑定,通过.sync传递,子组件可以通过传递的对应名称接受、通过$emit发送update:名称的事件方式更新对应的父组件中的值

父组件示例:

<template><div class="mytest"><div>父组件的name:{{ name }}</div><div>父组件的age:{{ age }}</div><Child :name.sync="name" :age.sync="age" /></div>
</template>
<script>
import Child from './child.vue'
export default {data() {return {name: 'WFT',age: 18}},components: { Child }
}
</script>

 子组件示例:

<template><div class="child"><div>我是子组件</div><el-input v-model="propName" placeholder="请输入内容"></el-input><el-input v-model.number="propAge" placeholder="请输入内容"></el-input></div>
</template>
<script>
export default {props: {name: {type: String,default: ''},age: {type: Number,default: 0}},computed: {propName: {get() {return this.name},set(val) {this.$emit('update:name', val)}},propAge: {get() {return this.age},set(val) {this.$emit('update:age', val)}}}
}
</script>

V3 

Vue3中介绍单个v-model绑定和多个v-model绑定中的传统方式和defineModel方式

defineModel是一个新的<script setup>宏,旨在简化支持v-model的组件的实现。它以前在3.3.x中作为实验特性发布,并在3.4.x中逐渐稳定。它现在为使用v-model修饰符提供了更好的支持。无需引入,直接使用即可,同defineProps、defineEmits

单个v-model绑定

传统方式 

父组件示例:

<template><div class="wft-projects"><div>父组件的name:{{ name }}</div><Child v-model="name" /></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import Child from './child.vue'const name = ref('WFT')</script>

子组件示例:

<template><div class="child"><h3>我是子组件</h3><el-input v-model="propName"></el-input></div>
</template>
<script setup lang='ts'>
import { computed } from 'vue'const props = withDefaults(defineProps<{modelValue?: string
}>(), {modelValue: '哈哈'
})const emits = defineEmits<{(e: 'update:modelValue', params: string): void
}>()const propName = computed({get() {return props.modelValue},set(val) {emits('update:modelValue', val)}
})
</script>

defineModel 

父组件示例:

同传统方式

<template><div class="wft-projects"><div>父组件的name:{{ name }}</div><Child v-model="name" /></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import Child from './child.vue'const name = ref('WFT')</script>

子组件示例:

<template><div class="child"><h3>我是子组件</h3><el-input v-model="propName"></el-input></div>
</template>
<script setup lang='ts'>const propName = defineModel<string>('modelValue', { default: 'default value' })</script>

使用defineModel真的是简化了太多代码,使用很方便 

多个v-model绑定

传统方式

父组件示例:

<template><div class="wft-projects"><div>父组件的name:{{ name }}</div><div>父组件的age:{{ age }}</div><Child v-model:name="name" v-model:age="age" /></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import Child from './child.vue'const name = ref('WFT')
const age = ref(18)</script>

子组件示例:

<template><div class="child"><h3>我是子组件</h3><el-input v-model="propName"></el-input><el-input v-model.number="propAge"></el-input></div>
</template>
<script setup lang='ts'>
import { computed } from 'vue'const props = withDefaults(defineProps<{name?:string,age?: number
}>(), {name: 'default name',age: 0
})const emits = defineEmits<{(e: 'update:name', params: string): void(e: 'update:age', params: number): void
}>()const propName = computed({get() {return props.name},set(val) {emits('update:name', val)}
})
const propAge = computed({get() {return props.age},set(val) {emits('update:age', val)}
})</script>

defineModel 

父组件示例:

同传统方式

<template><div class="wft-projects"><div>父组件的name:{{ name }}</div><div>父组件的age:{{ age }}</div><Child v-model:name="name" v-model:age="age" /></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import Child from './child.vue'const name = ref('WFT')
const age = ref(18)</script>

子组件示例: 

<template><div class="child"><h3>我组件</h3><el-input v-model="propName"></el-input><el-input v-model.number="propAge"></el-input></div>
</template>
<script setup lang='ts'>const propName = defineModel<string>('name', { default: 'default name' })
const propAge = defineModel<number>('age', { default: 0 })</script>

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

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

相关文章

互联网上门洗衣洗鞋工厂系统搭建;

随着移动互联网的普及&#xff0c;人们越来越依赖手机应用程序来解决生活中的各种问题。通过手机预约服务、购买商品、获取信息已经成为一种生活习惯。因此&#xff0c;开发一款上门洗鞋小程序&#xff0c;可以满足消费者对于方便、快捷、专业的洗鞋服务的需求&#xff0c;同时…

Vue-组件缓存-keep-alive

1. 介绍 在Vue.js中&#xff0c;组件的复用和缓存是一个重要的优化手段。当我们频繁切换组件时&#xff0c;频繁的销毁和重建会带来一定的性能开销。为了解决这个问题&#xff0c;Vue提供了一个名为keep-alive的抽象组件。下面我们将深入探讨keep-alive的工作原理、使用场景和…

Python学习之路-异常

Python学习之路-异常 简介 程序在运行时&#xff0c;如果 Python 解释器 遇到到一个错误&#xff0c;会停止程序的执行&#xff0c;并且提示一些错误信息&#xff0c;这就是异常。程序停止执行并且提示错误信息这个动作&#xff0c;我们通常称之为&#xff1a;抛出(raise)异常…

MYSQL第三次作业--单表查询

第三次作业 一、创建worker表 mysql> create table worker(-> 部门号 int(11) not null,-> 职工号 int(11) not null,-> 工作时间 date not null,-> 工资 float(8,2) not null,-> 政治面貌 varchar(10) not null default群众,-> 姓名 varchar(20) not n…

华为OD机试真题-开源项目热榜--Java-OD统一考试(C卷)

题目描述: 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源项目的热…

【无主之地3】最详细的补丁教程(酸奶公园)

【无主之地3】最详细的补丁教程&#xff08;酸奶公园&#xff09; steam已有游戏 1.迅雷种子下载文件&#xff0c;只用下载AddtionalContent这一个&#xff0c;放在文件夹OakGame下 2.将文件夹Engine&#xff1e;Binaries&#xff1e;ThirdParty&#xff1e;steamworks&a…

人脸识别(Java实现的)

虹软人脸识别&#xff1a; 虹软人脸识别的地址&#xff1a;虹软视觉开放平台—以免费人脸识别技术为核心的人脸识别算法开放平台 依赖包&#xff1a; 依赖包是从虹软开发平台下载的 在项目中引入这个依赖包 pom.xml <!-- 人脸识别 --><dependency><gr…

DeepFloyd IF:由文本生成图像的强大模型,能够绘制文字的 AI 图像工具

文章目录 一、DeepFloyd IF 简介二、DeepFloyd IF模型架构三、DeepFloyd IF模型生成流程四、DeepFloyd IF 模型定义 一、DeepFloyd IF 简介 DeepFloyd IF&#xff1a;能够绘制文字的 AI 图像工具 之前的 Stable Diffusion 和 Midjourney 都无法生成带有文字的图片&#xff0c;…

寒假冬令营(算法编程)1月12日(字符串)

题目描述&#xff08;1&#xff09; 1662. 检查两个字符串数组是否相等 . - 力扣&#xff08;LeetCode&#xff09; 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 数组表示的字符串…

C51--摇头测距小车

摇头测距小车——舵机和超声波封装 #include "reg52.h"#include "HC04.h" #include "Delay.h" #include "sg90.h" #include "motor.h"#define MIDDLE 0 #define LEFT 1 #define RIGHT 2void main() {char dir;double di…

YOLOv8改进 | 细节涨点篇 | UNetv2提出的一种SDI多层次特征融合模块(分割高效涨点)

一、本文介绍 本问给大家带来的改进机制是UNetv2提出的一种多层次特征融合模块(SDI)其是一种用于替换Concat操作的模块,SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。该方法已在多个公开的医学图像分割数据集上进行了验证,包括皮…

【数据库原理】(27)数据库恢复

在数据库系统中&#xff0c;恢复是指在发生某种故障导致数据库数据不再正确时&#xff0c;将数据库恢复到已知正确的某一状态的过程。数据库故障可能由多种原因引起&#xff0c;包括硬件故障、软件错误、操作员失误以及恶意破坏。为了确保数据库的安全性和完整性&#xff0c;数…

多合一小程序商城系统源码:支持全平台端口 附带完整的搭建教程

现如今&#xff0c;随着移动互联网的飞速发展&#xff0c;小程序已经成为电商行业的新宠。罗峰给大家分享一款多合一小程序商城系统源码。该系统旨在为商家提供一个功能强大、易于搭建和管理的电商平台&#xff0c;帮助商家快速占领市场&#xff0c;提高品牌影响力。 以下是部…

安卓之视频智能字幕的应用场景以及各种技术优劣分析

一、文章摘要 随着技术的发展&#xff0c;智能字幕已经成为了安卓平台上一个重要的功能&#xff0c;特别是在视频播放方面。它为用户提供了一种更方便、更快捷的方式来理解视频内容&#xff0c;尤其是在多种语言环境下或者在没有声音的环境中。下面我们将详细探讨安卓平台上视频…

BP-50 开发框架使用解读

【独家框架】UWB DWM1000 开源项目框架 - 基础知识 51uwb.cn [重要更新]51uwb_base code中断更新 - 基础知识 51uwb.cn 【软件资料】BP50 套件新框架定位代码实现 - 基础知识 51uwb.cn 【开源项目】纯Python TWR算法UWB上位机 - 基础知识 51uwb.cn 上位机软件通信协议更改说明 …

【打卡】牛客网:BM88 判断是否为回文字符串

我写的&#xff1a; 其实不用考虑奇数长度还是偶数长度。 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param str string字符串 待判断的字符串* return bool布尔型*/bool judge(strin…

day08

回顾 1.选择排序原理: 找到最小值的下标&#xff0c;交换 2.冒泡排序原理: 比较相邻的两个元素&#xff0c;把最小值放到左边。第一次比较的时候最大值放到最右边了&#xff0c;以此类推今天的内容 1类和对象 2.类和对象内存 3.构造方法 1.从生活的角度区理解面向对象开发 有两…

C program to check little vs. big endian

void main() {int n 1;// little endian if trueif(*(char *)&n 1)printf("This is little endian\n");elseprintf("This is big endian\n"); }Suppose we are on a 32-bit machine. And char type is 8 bits

如何配置mybatisplus基础环境?

1.在pom文件&#xff08;都加上吧&#xff0c;以防万一&#xff09; 2.若当初有mybatis的依赖&#xff0c;要删除 3.在Mapper接口加上"extends BaseMapper<实体类型>" 4.更改yml文件内容 别名扫描包&#xff1a;是指实体类型 5.添加"extends ServiceIm…

Python中英文时间转换

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…