Vue 3 useModel vs defineModel:選擇正確的雙向綁定方案

📖 概述

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…