简介

defineModel 是 Vue 3.4 引入并在 Vue 3.5+ 中稳定的一个组合式 API,它简化了组件的双向数据绑定实现。在此之前,实现双向绑定需要手动定义 props 和 emits,而 defineModel 将这个过程自动化,让代码更加简洁和直观。

主要特性

  • 简化双向绑定:自动处理 props 和 emits 的定义
  • 类型安全:完整的 TypeScript 支持
  • 多模型支持:支持多个 v-model 绑定
  • 向后兼容:与现有的 props/emits 模式完全兼容

基础用法

传统方式 vs defineModel

传统方式(Vue 3.4 之前):

<script setup>
// 子组件
const props = defineProps(["modelValue"]);
const emit = defineEmits(["update:modelValue"]);const updateValue = (newValue) => {emit("update:modelValue", newValue);
};
</script><template><input :value="props.modelValue" @input="updateValue($event.target.value)" />
</template>

使用 defineModel:

<script setup>
// 子组件
const model = defineModel();
</script><template><input v-model="model" />
</template>

父组件使用

<script setup>
import { ref } from "vue";
import MyInput from "./MyInput.vue";const inputValue = ref("Hello World");
</script><template><MyInput v-model="inputValue" /><p>当前值:{{ inputValue }}</p>
</template>

高级用法

综合示例

<!-- 子组件 -->
<script setup>
// 定义 v-model
const modelValue = defineModel();// 带默认值
const count = defineModel("count", { default: 0 });// 多个 v-model
const firstName = defineModel("firstName");
const lastName = defineModel("lastName");
</script><template><div class="min-h-screen bg-gray-100 py-8 px-4"><div class="max-w-lg mx-auto"><div class="bg-white rounded-lg shadow-md p-6"><h2 class="text-xl font-semibold text-gray-800 mb-6 text-center">用户信息表单</h2><div class="space-y-4"><!-- Main Value Input --><div><label class="block text-sm font-medium text-gray-700 mb-2">主要信息</label><div class="flex items-center space-x-3"><inputv-model="modelValue"placeholder="请输入主要信息"class="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-gray-500 focus:border-gray-500 transition-colors"/><span class="text-sm text-gray-600 min-w-0 flex-shrink-0">{{ modelValue || "未填写" }}</span></div></div><!-- Count Input --><div><label class="block text-sm font-medium text-gray-700 mb-2">数量</label><div class="flex items-center space-x-3"><inputv-model="count"type="number"placeholder="请输入数量"class="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-gray-500 focus:border-gray-500 transition-colors"/><span class="text-sm text-gray-600 min-w-0 flex-shrink-0">{{ count }}</span></div></div><!-- Name Inputs --><div><label class="block text-sm font-medium text-gray-700 mb-2">姓名</label><div class="grid grid-cols-2 gap-3 mb-2"><inputv-model="firstName"placeholder="名字"class="px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-gray-500 focus:border-gray-500 transition-colors"/><inputv-model="lastName"placeholder="姓氏"class="px-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-gray-500 focus:border-gray-500 transition-colors"/></div><div class="text-right"><span class="text-sm text-gray-600">{{firstName && lastName? `${firstName} ${lastName}`: "未完整填写"}}</span></div></div></div></div></div></div>
</template>
<!-- 父组件 -->
<script setup>
import { ref } from "vue";
import MyComponent from "./MyComponent.vue";const value = ref("Hello");
const count = ref(5);
const first = ref("John");
const last = ref("Doe");
</script><template><div class="min-h-screen bg-gray-50"><MyComponentv-model="value"v-model:count="count"v-model:firstName="first"v-model:lastName="last"/></div>
</template>

验证器

const count = defineModel("count", {default: 0,validator: (value) => {return typeof value === "number" && value >= 0;},
});

修饰符 (.trim, .lazy)

const text = defineModel("text", {default: "",// 使用 set 转换器自动去除空格set(value) {return typeof value === "string" ? value.trim() : value;},
});

与传统方式的对比

特性传统方式defineModel
代码量较多简洁
类型安全需手动定义自动推导
多模型支持复杂简单
学习成本较高较低
性能相同相同

注意事项

  1. Vue 版本要求:需要 Vue 3.4+ 版本
  2. 编译器支持:需要配置支持 defineModel 的编译器
  3. 向后兼容:可以与传统的 props/emits 方式混用
  4. SSR 支持:完全支持服务端渲染

总结

defineModel 是 Vue 3.5+ 中一个强大而简洁的 API,它大大简化了组件双向数据绑定的实现。通过减少样板代码、提供更好的类型支持和更直观的 API,它让开发者能够更专注于业务逻辑的实现。

无论是简单的表单输入还是复杂的自定义组件,defineModel 都能提供优雅的解决方案,是现代 Vue 开发中不可或缺的工具。

 Vue 3.5 defineModel:让组件开发效率提升 10 倍 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

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

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

相关文章

性能测试-性能测试中的经典面试题一

一、核心概念与流程类性能测试的核心类型与区别负载测试&#xff1a;逐步加压&#xff0c;探测系统阈值&#xff08;如最大TPS/响应时间&#xff09;。压力测试&#xff1a;超越阈值施压&#xff0c;验证系统崩溃点及恢复能力。稳定性测试&#xff1a;80%~90%峰值压力持续运行&…

华为昇腾芯片:多模态模型国产化的硬核突破

前言 在当今数字化时代&#xff0c;人工智能技术的发展日新月异&#xff0c;多模态模型作为 AI 领域的重要发展方向&#xff0c;正逐渐改变着人们与计算机交互的方式以及众多行业的运作模式。多模态模型能够处理多种类型的数据&#xff0c;比如图像、文本、语音等&#xff0c;从…

阿里智能AI框架Playground,即学即用

Spring AI Alibaba Playground 是 Spring AI Alibaba 社区以 Spring AI Alibaba 和 Spring AI 为框架搭建的 AI 应用。包含完善的前端 UI 后端实现&#xff0c;具备对话&#xff0c;图片生成&#xff0c;工具调用&#xff0c;RAG&#xff0c;MCP 等众多 AI 相关功能。在 playg…

智能Agent场景实战指南 Day 28:Agent成本控制与商业模式

【智能Agent场景实战指南 Day 28】Agent成本控制与商业模式 文章标签 AI Agent, 成本优化, 商业模式, LLM应用, 企业级AI 文章简述 本文是"智能Agent场景实战指南"系列的第28天&#xff0c;聚焦智能Agent的成本控制与商业模式设计这一关键课题。文章首先分析了Ag…

sqli-labs:Less-8关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;单引号包裹&#xff09;提示&#xff1a;参数id需以闭合 同样无法像常规一样回显&#xff0c;php输出语句的代码如下&…

LeetCode 1782.统计点对的数目

给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成&#xff0c;其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数…

U-Mail邮件系统-全面适配信创环境的国产邮件系统

在当今数字化时代&#xff0c;邮件系统作为企业、政府机构以及各类组织日常办公不可或缺的沟通工具&#xff0c;其安全性、稳定性以及自主可控性的重要性日益凸显。随着信创产业的蓬勃发展&#xff0c;国产邮件系统应运而生&#xff0c;成为保障信息安全、推动数字化转型的关键…

【LeetCode 热题 100】394. 字符串解码

Problem: 394. 字符串解码 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没有…

Activity之间互相发送数据

activity_send_data_req.xml<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

设计模式:访问者模式 Visitor

目录前言问题解决方案结构代码前言 访问者是一种行为设计模式&#xff0c;它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体&#xff08;例如一座城市&#xff09;&#xff0c; 也…

OpenCV 学习探秘之四:从角点检测,SIFT/SURF/ORB特征提取,目标检测与识别,Haar级联分类人脸检测,再到机器学习等接口的全面实战应用与解析

书接上回&#xff0c;前面介绍了一些基本应用&#xff0c;本篇则着重介绍一些比较复杂的应用。 附&#xff1a;本文所用例子中使用的Opencv库OpenCV4.5.4版本编译好的库 五、特征提取与描述 5.1 角点检测&#xff1a;Harris 角点和 Shi-Tomasi 角点 5.1.1 Harris 角点检测&a…

《秋招在即!Redis数据类型面试题解析》

博客主页&#xff1a;天天困啊系列专栏&#xff1a;面试题关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Redis中常见的基础数据结构总共五种&#xff1a;这五种类型分别为String&#xff…

政务网站内容检测系统对错敏信息有什么作用

政务网站内容检测系统在错敏信息管理中发挥着重要作用&#xff0c;能够有效提升政府网站的信息安全性与合规性。以下从错敏信息的作用及蚁巡政务信息巡查系统的功能特点两方面进行说明。一、政务网站内容检测系统对错敏信息的作用1、实时监测与识别内容检测系统通过智能化技术对…

Tower of Hanoi 汉诺塔

题目描述The Tower of Hanoi game consists of three stacks (left, middle and right) and n round disks of different sizes. Initially, the left stack has all the disks, in increasing order of size from top to bottom. The goal is to move all the disks to the r…

在 Docker 中启动 Nginx 并挂载配置文件到宿主机目录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 在 Docker 中启动 Nginx 并挂载配置文件到宿主机目录前言一、创建宿主机目录存放 Nginx 配置1.1 在宿主机&#xff08;如 Windows 或 Linux&#xff09;上创建目录&#xff0…

认识ansible(入门)

什么是ansible&#xff1f;Ansible是一款自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块…

Apache Ignite 关于 **Executor Service(执行器服务)** 的介绍

这段内容是 Apache Ignite 关于 Executor Service&#xff08;执行器服务&#xff09; 的介绍。我们可以把它理解为&#xff1a;一个分布式的“线程池”&#xff0c;可以把任务分发到集群中的多个节点上去执行。 下面我用通俗易懂的方式帮你彻底理解这个概念。&#x1f310; 什…

应用Builder模式在C++中进行复杂对象构建

引言 在软件开发中&#xff0c;构建复杂对象时常常会遇到构造函数或setter方法过于复杂的情况。Builder模式作为一种创建型设计模式&#xff0c;能够有效地解决这一问题。Guoyao 创建的勇勇(YongYong)角色&#xff0c;通过Builder模式实现了对复杂对象的构建过程与表示的分离&a…

gradio作为原型工具

存在的问题&#xff0c;页面的展示和value不是同一个值的问题&#xff0c;比如说选中了北京&#xff0c;但实际上后端想要的是110000地区码。 在实际开发中&#xff0c;前端展示给用户的是可读的地区名称&#xff08;如“北京”&#xff09;&#xff0c;而背后处理时通常需要的…

计算声子谱

准备的还是vasp的必备文件&#xff1a;POSCAR POTCAR KPOINTS&#xff0c;剩下需要的INCAR、band文件下面代码可以生成&#xff1a;#!/bin/bash if [ ! -f band.conf ];then cat >>band.conf <<EOF ATOM_NAME Ti Al B DIM 1 1 1 BAND 0.0 0.0 0.0 0.5 -0.5 0.5…