📖 概述

useModel() 是 Vue 3.4+ 版本中引入的一个组合式 API 辅助函数,它是驱动 defineModel() 的底层实现。这个函数主要用于在非单文件组件中实现双向数据绑定,特别是在使用原始的 setup() 函数时。

⚠️ 重要提示:如果使用 <script setup>,应当优先使用 defineModel()

🎯 基本概念

什么是 useModel?

useModel() 是一个用于创建双向数据绑定的底层辅助函数。它允许子组件直接修改父组件传递的 prop 值,而无需手动触发 emit 事件。

与 defineModel 的关系

特性defineModel()useModel()
使用场景<script setup> 语法糖底层实现
代码简洁度⭐⭐⭐⭐⭐⭐⭐⭐
控制精细度⭐⭐⭐⭐⭐⭐⭐⭐
推荐程度应当优先使用特定场景使用
  • ✅ defineModel() 是 <script setup> 中的语法糖,更简洁易用,应当优先使用
  • 🔧 useModel() 是底层实现,适用于非单文件组件或需要更精细控制的场景

🔧 函数签名

function useModel(props: Record<string, any>,key: string,options?: DefineModelOptions
): ModelRef;type DefineModelOptions<T = any> = {get?: (v: T) => any;set?: (v: T) => any;
};type ModelRef<T, M extends PropertyKey = string, G = T, S = T> = Ref<G, S> &[ModelRef<T, M, G, S>, Record<M, true | undefined>];

📋 参数说明

参数类型必需描述
propsRecord<string, any>组件的 props 对象
keystring要绑定的 prop 名称
optionsDefineModelOptions自定义 getter 和 setter 函数

🎯 使用场景

1️⃣ 非单文件组件中的双向绑定

当使用传统的 setup() 函数而不是 <script setup> 时,useModel() 是创建双向绑定的最佳选择。在 <script setup> 中,请优先使用 defineModel()

2️⃣ 需要自定义转换逻辑

当需要对传入和传出的值进行转换时,可以使用 options 参数。

3️⃣ 复杂的组件库开发

在开发可复用的组件库时,可能需要更精细的控制。

💻 代码示例

🚀 基础用法

export default {props: ["count"],emits: ["update:count"],setup(props) {const count = useModel(props, "count");// 直接修改值会自动触发 emitcount.value = 1;return {count,};},
};

🔄 带自定义转换的用法

export default {props: ["value"],emits: ["update:value"],setup(props) {const modelValue = useModel(props, "value", {// 自定义 getter:将字符串转换为数字get: (v) => (v ? parseInt(v) : 0),// 自定义 setter:将数字转换为字符串set: (v) => v.toString(),});return {modelValue,};},
};

🎨 在模板中使用

<template><div><input :value="count" @input="count = $event.target.value" /><button @click="count++">增加</button></div>
</template><script>
export default {props: ["count"],emits: ["update:count"],setup(props) {const count = useModel(props, "count");return {count,};},
};
</script>

⚖️ 与 defineModel 的对比

✅ defineModel (推荐用于 script setup)

<script setup>
const count = defineModel("count");
</script>

🔧 useModel (适用于 setup 函数)

export default {props: ["count"],emits: ["update:count"],setup(props) {const count = useModel(props, "count");return { count };},
};

⚠️ 注意事项

🔢 版本要求

  • 🚫 仅在 Vue 3.4+ 版本中可用
  • ✅ 确保项目依赖版本满足要求

📝 Props 和 Emits 声明

与 defineModel() 不同,使用 useModel() 时需要手动声明:

  • 📦 props 数组或对象
  • 📤 emits 数组或对象

🛡️ 类型安全

在 TypeScript 项目中,建议为 props 和 emits 提供完整的类型定义:

interface Props {count: number;
}interface Emits {"update:count": [value: number];
}export default {props: ["count"] as PropType<Props>,emits: ["update:count"] as Emits,setup(props: Props) {const count = useModel(props, "count");return { count };},
};

🎯 最佳实践

1️⃣ 优先使用 defineModel

在 <script setup> 中,应当优先使用 defineModel(),代码更简洁易读。 只有在以下情况下才考虑使用 useModel()

  • 🔧 使用传统的 setup() 函数
  • ⚙️ 需要更精细的控制和自定义转换逻辑
  • 📚 开发复杂的组件库

2️⃣ 合理使用自定义转换

只在确实需要数据转换时使用 options 参数,避免过度复杂化。

3️⃣ 保持一致性

在同一个项目中,保持双向绑定的实现方式一致。

4️⃣ 类型安全

在 TypeScript 项目中,始终提供完整的类型定义。

❓ 常见问题

Q: 什么时候使用 useModel 而不是 defineModel?

A: 在 <script setup> 中,应当优先使用 defineModel() 只有在以下情况下才使用 useModel()

  • 🔧 使用传统的 setup() 函数而不是 <script setup>
  • ⚙️ 需要自定义 getter/setter 进行复杂的数据转换
  • 🎛️ 需要更精细的控制逻辑

Q: useModel 是否支持多个双向绑定?

A: 是的,可以多次调用 useModel() 来创建多个双向绑定。

Q: 如何处理复杂的验证逻辑?

A: 可以在 options.set 中添加验证逻辑,如果验证失败可以抛出错误或返回原值。

📝 总结

useModel() 是 Vue 3.4+ 中实现双向数据绑定的强大工具,特别适用于非单文件组件。重要原则:在 <script setup> 中,应当优先使用 defineModel(),代码更简洁易读。 只有在使用传统的 setup() 函数或需要更精细控制时,才考虑使用 useModel()。理解这两个 API 的使用场景和差异,有助于在 Vue 3 项目中更好地实现组件间的数据通信。

 Vue 3 useModel vs defineModel:选择正确的双向绑定方案 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

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

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

相关文章

数据库备份sql文件过大,phpAdmin无法执行Sql

数据库导出为sql文件&#xff0c;文件太大导致无法再Sql query执行&#xff0c;可使用命令行执行&#xff1a; windows系统&#xff1a; 1.切换到mysql 安装目录的bin目录下 cd C:\xampp\mysql\bin 2.执行备份sql还原mysql数据库 mysql -u root -p databasename < C://backu…

三格电子——ModbusTCP 转 Profinet 主站网关应用实例

型号&#xff1a;SG-TCP- Profinet(M)一、使用场景ModbusTCPClient 通过 ModbusTCP 控制 Profinet 接口设备&#xff0c; Profinet 接口设备接入DCS/工控机等。产品是ModbusTCP和Profinet(M)网关&#xff08;以下简称网关&#xff09;&#xff0c;使用数据映射 方式工作。 本产…

网址账号正确,密码错误返回的状态码是多少

问题网址账号正确&#xff0c;密码错误返回的状态码是多少我的回答当账号正确但密码错误时&#xff0c;服务器通常会返回401 Unauthorized状态码。这个状态码表示"未授权"&#xff0c;意味着客户端请求缺乏有效的身份验证凭据&#xff0c;或者提供的凭据无效。在实际…

JAVA核心基础篇-操作符

Java 操作符是用于操作变量和值的特殊符号&#xff0c;主要分为以下几类&#xff1a;1. 算术运算符用于执行基本的数学运算&#xff1a;&#xff1a;加法&#xff08;也可用于字符串拼接&#xff09;-&#xff1a;减法*&#xff1a;乘法/&#xff1a;除法&#xff08;整数相除取…

数据库字段类型深度解析:从关系型到 NoSQL 的全面指南

数据库字段类型深度解析&#xff1a;从关系型到 NoSQL 的全面指南 一、引言&#xff1a;数据库字段类型的重要性 在现代软件开发和数据管理中&#xff0c;数据库作为核心组件&#xff0c;其性能、可扩展性和数据完整性在很大程度上取决于字段类型的选择。作为专业的开发者和数据…

蓝牙aoa仓库管理系统功能介绍

在现代仓储物流的快节奏运作中&#xff0c;高效管理仓库人员的位置与行动轨迹&#xff0c;成为提升整体运营效率的关键。蓝牙AOA&#xff08;Angle of Arrival&#xff0c;信号到达角&#xff09;技术应运而生&#xff0c;以其独特的优势和强大的功能&#xff0c;为仓库人员定位…

【轻量级密码算法】当安全遇上资源瓶颈:轻量级加密为何成为 IoT 时代的刚需?

在智能家居的场景中&#xff0c;当你轻触智能门锁的指纹识别区域&#xff0c;期望它能快速响应并解锁时&#xff0c;你是否想过在这短短几秒内&#xff0c;门锁内部的微控制器&#xff08;MCU&#xff09;正在进行着复杂的安全验证操作&#xff1f;然而&#xff0c;对于大多数资…

嵌入式开发学习———Linux环境下网络编程学习(四)

数据库简介数据库是结构化数据的集合&#xff0c;用于高效存储、检索和管理数据。常见的数据库类型包括关系型&#xff08;如MySQL、SQLite&#xff09;和非关系型&#xff08;如MongoDB&#xff09;。关系型数据库使用表格形式存储数据&#xff0c;并通过SQL&#xff08;结构化…

在 CentOS 7 上搭建 OpenTenBase 集群:从源码到生产环境的全流程指南

目 录什么是OpenTenBaseOpenTenBase源码编译安装安装依赖创建opentenbase用户源码获取编译安装初始化数据库初始化数据库集群启动与停止服务基本使用示例开机自启动配置总结官网教程链接什么是OpenTenBase OpenTenBase 是一个提供写可靠性&#xff0c;多主节点数据同步的关系数…

LoRaWAN网络部署全流程:从方案设计到实际落地的关键要点

一、覆盖范围&#xff1a;从理论到实践 LoRaWAN的覆盖距离在理论上可达15公里&#xff0c;但实际部署受地形和环境影响极大。 城市环境中&#xff0c;密集的建筑群和多径效应常常使网关有效覆盖半径缩小至3至5公里&#xff1b;在空旷的农村或农田场景中&#xff0c;覆盖范围可提…

portswigger labs XXE漏洞利用实战

lab1 利用外部实体注入获取文件解决此 lab 需要读取到/etc/passwd<!DOCTYPE test [ <!ENTITY cmd SYSTEM "file:///etc/passwd"> ]> <productId>&cmd;</productId>lab2 利用 XXE 执行 SSRF 攻击通过构造 xxe 请求特定的 url 获取目录拼接…

深入理解 hash -r:解决 Linux 命令缓存难题的关键密钥

前言&#xff1a;在 Linux 终端的日常操作中&#xff0c;你是否遇到过这样的诡异场景&#xff1a;明明已经升级或切换了软件版本&#xff08;比如 Node.js 从旧版更新到新版 &#xff09;&#xff0c;但执行命令时&#xff0c;系统却像被“施了魔法”&#xff0c;依旧执着地调用…

onnx入门教程(二)—— PyTorch 转 ONNX 详解

在这一节里&#xff0c;我们将详细介绍 PyTorch 到 ONNX 的转换函数—— torch.onnx.export。我们希望大家能够更加灵活地使用这个模型转换接口&#xff0c;并通过了解它的实现原理来更好地应对该函数的报错&#xff08;由于模型部署的兼容性问题&#xff0c;部署复杂模型时该函…

嵌入式LINUX——————网络TCP

一、TCP连接1.TCP特点&#xff1a;&#xff08;1&#xff09;面向链接&#xff08;2&#xff09;面向字节流&#xff08;3&#xff09;安全可靠的传输协议&#xff0c;因为会先建立连接&#xff08;4&#xff09;占用资源开销大&#xff0c;效率低&#xff0c;实时性不佳&#…

alicloud 阿里云有哪些日志 审计日志

1: 阿里有哪些audit log: Audit Related Logs Below table describe the logs available in Log Service that might be applicable to the Security Operations Team. 2: 怎么来分析呢? Overview Its recommended to built a program with SLS Consumer Group which real…

如何理解AP服务发现协议中“如果某项服务需要被配置为可通过多个不同的网络接口进行访问,则应为每个网络接口使用一个独立的客户端服务实例”?

上一句&#xff1a;[PRS_SOMEIPSD_00238]◎ 「如果某项服务需要在多个网络接口上提供&#xff0c;则应为每个网络接口使用一个独立的服务器服务实例。」(RS_SOMEIPSD_00003) 本句&#xff1a;[PRS_SOMEIPSD_00239] 「如果某项服务需要被配置为可通过多个不同的网络接口进行访问…

piecewise jerk算法介绍

piecewise jerk算法介绍 piecewise jerk算法是百度Apollo中的一种用于路径和速度平滑的算法&#xff0c;该算法假设相邻点之间的jerk为常数&#xff0c;基于该假设将平滑问题构建为二次规划问题&#xff0c;调用osqp求解器求解。参考论文为&#xff1a;Optimal Vehicle Path Pl…

分布式蜜罐系统的部署安装

前阵子勒索病毒泛滥&#xff0c;中小企业由于缺少专业EDR&#xff0c;态势感知&#xff0c;IPS等设备&#xff0c;往往是在勒索事件发生之后才后知后觉&#xff0c;也因为缺乏有效的备份策略&#xff0c;导致数据&#xff0c;经济&#xff0c;商业信誉的丧失&#xff0c;甚至还…

定时器互补PWM输出和死区

定时器互补PWM输出和死区互补PWM&#xff08;Complementary PWM&#xff09;H桥、全桥、半桥中的应用为什么需要死区时间互补PWM&#xff08;Complementary PWM&#xff09; 是一种特殊的 PWM 输出模式&#xff0c;通常用于H桥、全桥或半桥电路的驱动。其核心原理是利用定时器…

嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置

嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置 文章目录 嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置 一.总的网络配置过程 二.主机配置 三.QEMU ARM 网络配置 四.主机与虚拟器之间的网络测试 五.TFTP网络配置 5.1 ubuntu主机安装tftp服务器 5.2 设置tft…