Vue 3 中ref 結合ts 獲取 DOM 元素的實踐指南。

文章目錄

  • 前言
    • 一、為什么需要為 ref 添加類型?
    • 二、基本用法:引用 DOM 元素
      • 1. 引用通用 DOM 元素(`HTMLElement`)
      • 2. 引用特定類型的 DOM 元素(如 `HTMLDivElement`)
    • 三、<script setup> 語法中的類型定義
    • 四、引用自定義組件實例
    • 五、最佳實踐與注意事項
  • 總結


前言

在 Vue 3 的開發中,使用 ref 獲取 DOM 元素是常見的操作。然而,在 TypeScript 項目中,如何為 ref 添加正確的類型注解以確保類型安全,是許多開發者關心的問題。本文將結合實際案例,深入講解 Vue 3 中 ref 的類型定義方法,幫助你寫出更健壯的代碼。


一、為什么需要為 ref 添加類型?

在 Vue 3 中,ref 可以用于響應式數據,也可以用于引用 DOM 元素或組件實例。默認情況下,refvalue 屬性是 any 類型,這會導致以下問題:

  1. 類型不安全:無法在編譯時檢查 DOM 操作的合法性。
  2. 代碼可讀性差:其他開發者難以理解 ref 的具體用途。
  3. IDE 支持不足:無法享受 TypeScript 的自動補全和錯誤提示。

通過為 ref 添加明確的類型注解,可以解決這些問題,提升代碼質量和開發效率。


二、基本用法:引用 DOM 元素

1. 引用通用 DOM 元素(HTMLElement

	import { ref, onMounted } from 'vue';export default {setup() {// 定義一個 ref,類型為 HTMLElement 或 nullconst myElement = ref<HTMLElement | null>(null);onMounted(() => {if (myElement.value) {console.log('DOM 元素:', myElement.value);myElement.value.style.color = 'red'; // 合法操作}});return {myElement};}};
  • 關鍵點

    • ref<HTMLElement | null>(null) 表示 value 可能是 HTMLElementnull
    • 在訪問 value 時需要進行非空檢查。

2. 引用特定類型的 DOM 元素(如 HTMLDivElement

	import { ref, onMounted } from 'vue';export default {setup() {// 定義一個 ref,類型為 HTMLDivElement 或 nullconst myDiv = ref<HTMLDivElement | null>(null);onMounted(() => {if (myDiv.value) {console.log('Div 元素:', myDiv.value);myDiv.value.style.backgroundColor = 'yellow'; // 合法操作}});return {myDiv};}};
  • 優勢

    • 使用更具體的類型(如 HTMLDivElement)可以享受更精確的類型檢查。
    • IDE 會提供對應元素的屬性和方法提示。

三、

在 Vue 3 的 <script setup> 語法中,類型定義更加簡潔:

	<script setup lang="ts">import { ref, onMounted } from 'vue';const myElement = ref<HTMLElement | null>(null);onMounted(() => {if (myElement.value) {console.log('DOM 元素:', myElement.value);myElement.value.style.fontSize = '20px'; // 合法操作}});</script><template><div ref="myElement">點擊我</div></template>
  • 特點

    • <script setup> 語法更簡潔,類型定義與普通 setup 函數一致。
    • 模板中直接使用 ref 名稱即可。

四、引用自定義組件實例

如果需要引用自定義組件實例,可以使用 InstanceType 獲取組件實例類型:

	import { ref } from 'vue';import MyComponent from './MyComponent.vue';export default {setup() {// 定義一個 ref,類型為 MyComponent 的實例或 nullconst componentRef = ref<InstanceType<typeof MyComponent> | null>(null);// 訪問組件方法或屬性if (componentRef.value) {componentRef.value.someMethod(); // 合法操作}return {componentRef};}};
  • 關鍵點

    • InstanceType<typeof MyComponent> 獲取組件實例的類型。
    • 適用于需要調用組件方法或訪問組件屬性的場景。

五、最佳實踐與注意事項

  1. 始終進行非空檢查

    	if (myElement.value) {// 安全操作}
    
    • 避免直接訪問 myElement.value,可能導致運行時錯誤。
  2. 使用更具體的類型

    • 如果知道 DOM 元素的具體類型(如 HTMLDivElement),優先使用具體類型。
  3. 避免在模板中直接操作 DOM

    • Vue 推薦通過數據驅動視圖,而非直接操作 DOM。
    • 僅在需要復雜交互(如第三方庫集成)時使用 ref
  4. 類型定義與模板綁定

    • 確保模板中的 ref 名稱與 setup 中定義的 ref 名稱一致。

總結

通過為 Vue 3 中的 ref 添加明確的類型注解,可以:

  1. 提升類型安全性:在編譯時捕獲潛在錯誤。
  2. 增強代碼可讀性:明確 ref 的用途。
  3. 享受 IDE 支持:自動補全和類型檢查。

掌握這一技巧后,你的 Vue 3 + TypeScript 項目將更加健壯和易于維護。希望本文能幫助你更好地使用 Vue 3 的 ref 功能!

希望這篇博客能對你的 Vue 3 + TypeScript 開發有所幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Axure形狀類組件圖標庫(共8套)

點擊下載《月下倚樓圖標庫(形狀組件)》 原型效果&#xff1a;https://axhub.im/ax9/02043f78e1b4386f/#g1 摘要 本圖標庫集錦精心匯集了8套專為Axure設計的形狀類圖標資源&#xff0c;旨在為產品經理、UI/UX設計師以及開發人員提供豐富多樣的設計素材&#xff0c;提升原型設計…

01串(二進制串)與集合之間存在天然的對應關系 ← bitset

【集合的二進制表示?】 ● 01 串&#xff08;二進制串&#xff09;與集合之間存在天然的對應關系。對應機理為每個二進制位可以表示集合中一個元素的存在&#xff08;1&#xff09;或不存在&#xff08;0&#xff09;。例如&#xff0c;集合 {a, b, c} 的子集 {a, c} 可以表示…

vba學習系列(10)--外觀報表

系列文章目錄 文章目錄 系列文章目錄前言一、外觀報表1.產能統計2.單板數3.固定傷排查4.件號良率5.鏡片批退率6.鏡筒批退率 總結 前言 一、外觀報表 1.產能統計 Sub ProcessInspectionData()Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As WorksheetDim lastRow1 As Long, …

machine_env_loader must have been assigned before creating ssh child instance

在主機上執行roslaunch命令時&#xff0c;報錯&#xff1a;machine_env_loader must have been assigned before creating ssh child instance。 解決辦法&#xff1a; 打開hostos文件&#xff0c;檢查local host 前的內部ip是否正常。操作示例&#xff1a; 先輸入下方指令打…

CSS radial-gradient函數詳解

目錄 基本語法 關鍵參數詳解 1. 漸變形狀&#xff08;Shape&#xff09; 2. 漸變大小&#xff08;Size&#xff09; 3. 中心點位置&#xff08;Position&#xff09; 4. 顏色斷點&#xff08;Color Stops&#xff09; 常見應用場景 1. 基本圓形漸變 2. 橢圓漸變 3. 模…

分析Web3下數據保護的創新模式

在這個信息爆炸的時代&#xff0c;我們正站在 Web3 的門檻上&#xff0c;迎接一個以去中心化、用戶主權和數據隱私為核心的新時代。Web3 不僅僅是技術的迭代&#xff0c;它更是一場關于數據權利和責任的結構性變革。本文將探討 Web3 下數據保護的創新模式&#xff0c;以期為用戶…

RabbitMQ-Go 性能分析

更多個人筆記見&#xff1a; &#xff08;注意點擊“繼續”&#xff0c;而不是“發現新項目”&#xff09; github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習&#xff0c;學習過程中還會不斷補充&…

AI助力Java開發:減少70%重復編碼,實戰效能提升解析

工具再先進&#xff0c;也替代不了編程思維的深度錘煉 在Java開發領域&#xff0c;重復編碼如同無形的生產力黑洞——以商品管理模塊開發為例&#xff0c;開發者耗費大量時間編寫SQL查詢、處理結果集轉換&#xff1b;用戶系統里&#xff0c;密碼加密和狀態管理的代碼在不同項目…

JS語法筆記

目錄 JS數組Array新建數組一維數組二維數組 reverse()在數組末尾插入&#xff1a;push()在數組末尾刪除&#xff1a;pop()在數組開頭插入&#xff1a;unshift()從數組開頭刪除一個元素shift()splice() MapSet JS數組Array 判斷數組相等不能用&#xff0c;要循環判斷 新建數組…

uniapp-商城-77-shop(8.2-商品列表,地址信息添加,級聯選擇器picker)

地址信息,在我們支付訂單上有這樣一個接口,就是物流方式,一個自提,我們就顯示商家地址。一個是外送,就是用戶自己填寫的地址。 這里先說說用戶的地址添加。需要使用到的一些方式方法,主要有關于地址選擇器,就是uni-data-picker級聯選擇。 該文介紹了電商應用中地址信息處…

網頁前端開發(基礎進階3--Vue)

Vue3 Vue是一款用于構建用戶界面的漸進式的JavaScript框架。 Vue由2部分組成&#xff1a;Vue核心包&#xff0c;Vue插件包 Vue核心包包含&#xff1a;聲明式渲染&#xff0c;組件系統。 Vue插件包&#xff1a;VueRouter&#xff08;客戶端路由&#xff09;&#xff0c;Vuex…

大模型相關技術綜述

多模態大模型&大模型訓練語料持續迭代 已經開始整理多模態-視覺部分&#xff1a; 主要分為一下幾塊 多模態信息壓縮模型&#xff08;clip、vit、swiT&#xff09; 生成模型&#xff08;vae、gan、flow、ddpm、sde…) 其它多模態大模型&#xff08;語音、視頻、slam、3…

Vue3中Ant-design-vue的使用-附完整代碼

前言 首先介紹一下什么是Ant-design-vue Ant Design Vue 是基于 Vue 3 的企業級 UI 組件庫&#xff08;同時兼容 Vue 2&#xff09;&#xff0c;是螞蟻金服開源項目 Ant Design 的 Vue 實現版本。它遵循 Ant Design 的設計規范&#xff0c;提供豐富的組件和高質量的設計體系&…

建造者模式:優雅構建復雜對象

引言 在軟件開發中&#xff0c;有時我們需要創建一個由多個部分組成的復雜對象&#xff0c;這些部分可能有不同的變體或配置。如果直接在一個構造函數中設置所有參數&#xff0c;代碼會變得難以閱讀和維護。當對象構建過程復雜&#xff0c;且需要多個步驟時&#xff0c;我們可…

如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式(并進行了訓練、推理)

計劃讓AI幫助編程使用TabPFN模型進行股價推理 原計劃提問的prompt 如何通過akshare庫&#xff0c;獲取股票數據&#xff0c;并生成TabPFN這個模型 可以識別、處理的格式 本意是想讓AI分步執行&#xff0c;先處理股票數據&#xff0c;然后再進行模型訓練&#xff0c;結果豆包超…

[藍橋杯]最大化股票交易的利潤

最大化股票交易的利潤 題目描述 實現一個算法尋找最大化股票交易利潤的策略。介紹如下&#xff1a; 股票價格每天都在變化&#xff0c;以數組的索引表示交易日&#xff0c;以數組的元素表示每天的股票價格。可以通過買入和賣出獲得利潤。一天只能進行一次買入或賣出操作&…

URL 結構說明+路由(接口)的認識

一、URL 結構說明 以這個為例&#xff1a;http://127.0.0.1:5000/zhouleifeng 1.組成部分: http://&#xff1a;協議 127.0.0.1&#xff1a;主機&#xff08;本地地址&#xff09; :5000&#xff1a;端口號&#xff08;Flask 默認 5000&#xff09; /zhouleifeng&#xff1a…

微服務商城-用戶微服務

數據表 用戶表 CREATE DATABASE user; USE user;CREATE TABLE user (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 用戶ID,username varchar(50) NOT NULL DEFAULT COMMENT 用戶名,password varchar(50) NOT NULL DEFAULT COMMENT 用戶密碼&#xff0c;MD5加密…

Java面試題及答案整理( 2025年最新版,持續更新...)

最近發現網上很多Java面試題都沒有答案&#xff0c;所以花了很長時間搜集整理出來了這套Java面試題大全&#xff0c;希望大家能夠喜歡&#xff01; 注&#xff1a;篇幅有限&#xff0c;資料已整理成文檔&#xff0c;后臺si我666&#xff0c;我一個個發&#xff01; 這套面試文…

[論文閱讀]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning

PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning | IJCAI IJCAI-22 發表于2022年的論文&#xff0c;當時大家還都在做小模型NLP的相關工作&#xff08;BERT&#xff0c;Ro…