4.6 Vue 3 中的模板引用 (Template Refs)

在 Vue 3 中,ref 是一個核心的響應式 API,但它在模板中還有另一個非常重要的用途:獲取對 DOM 元素或子組件實例的直接引用。這就是我們所說的“模板引用”。

核心概念

  • 目的:讓你在父組件中能夠直接訪問并操作特定的 DOM 元素或子組件實例。
  • 場景
    • 手動聚焦一個輸入框。
    • 觸發一個 DOM 元素上的動畫。
    • 調用子組件暴露的特定方法(非響應式數據)。
    • 測量 DOM 元素的尺寸。
    • 與需要直接 DOM 訪問的第三方庫集成。

基本用法

  1. 在模板中聲明 ref

    在你想要引用的元素或組件上,使用 ref attribute(在 Vue 3 的 <script setup> 中,這實際上是一個特殊的指令,但用法像 attribute)。

    <template><!-- 引用一個 DOM 元素 --><input ref="inputRef" type="text" placeholder="請輸入..." /><!-- 引用一個子組件 --><ChildComponent ref="childRef" />
    </template>
  2. <script setup> 中定義響應式引用

    使用 ref 函數在 <script setup> 中聲明一個變量,這個變量的名字必須與模板中 ref attribute 的值完全一致。Vue 會自動將 DOM 元素或組件實例賦值給這個響應式引用。

    <script setup>
    import { ref, onMounted } from 'vue'
    import ChildComponent from './ChildComponent.vue'// 定義響應式引用,名字必須與模板中的 ref 值匹配
    const inputRef = ref(null)
    const childRef = ref(null)// 組件掛載后,引用才可用
    onMounted(() => {// 訪問 DOM 元素if (inputRef.value) {inputRef.value.focus() // 讓輸入框自動獲得焦點console.log('Input width:', inputRef.value.offsetWidth)}// 調用子組件的方法 (假設子組件暴露了 doSomething 方法)if (childRef.value) {childRef.value.doSomething()}
    })
    </script>

關鍵要點與注意事項

  1. 響應式引用 (ref) vs 模板引用 (ref attribute)

    • ref()?是一個函數,用于創建一個響應式引用對象。這個對象有一個?.value?屬性,用來存儲值(在這里是 DOM 元素或組件實例)。
    • 模板中的?ref="xxx"?是一個特殊的 attribute,它告訴 Vue 將這個元素/組件的引用注入到名字為?xxx?的響應式引用 (ref) 中。
    • 名字必須匹配const xxx = ref(null)?和?ref="xxx"?中的?xxx?必須完全相同。
  2. 初始值與訪問時機

    • 通常將響應式引用初始化為?null?(const myRef = ref(null)),因為在組件掛載前,DOM 元素或子組件實例還不存在。
    • 在?onMounted?生命周期鉤子之前,引用的?.value?通常是?null。因為 DOM 渲染發生在?onMounted?之后。
    • 最佳實踐:在?onMounted?或?onUpdated?鉤子中訪問引用,或者在事件處理函數中(確保元素已渲染)。
  3. 引用類型

    • DOM 元素:引用?.value?直接指向原生的 DOM 元素對象(如?HTMLInputElement,?HTMLDivElement?等),你可以調用其所有原生方法和屬性。
    • 子組件:引用?.value?指向子組件的實例。你可以訪問子組件的公開屬性和方法(即在?setup?返回或在?<script setup>?中用?defineExpose?暴露的屬性/方法)。
    <!-- ChildComponent.vue -->
    <script setup>
    import { ref } from 'vue'const count = ref(0)// 暴露給父組件的方法
    function increment() {count.value++
    }// 明確暴露哪些屬性/方法給父組件
    defineExpose({increment,// count // 也可以暴露響應式數據,但需謹慎
    })
    </script>
  4. 訪問子組件的 $el

    • 在 Vue 3 的 Composition API 中,子組件實例本身不直接是 DOM 元素。如果你需要訪問子組件的根 DOM 元素,可以通過子組件實例的?$.vnode.el?屬性(這是 Vue 內部的,不推薦直接依賴)或者讓子組件通過?defineExpose?暴露其根元素的引用。
  5. v-for 中的模板引用

    • 當?ref?用在?v-for?內部的元素或組件上時,對應的引用將是一個包含相應數據的數組,順序與?v-for?渲染的順序一致。
    • 重要ref?不會隨著?v-for?數據的更新而自動同步更新數組。如果數據列表變化(增刪改),你需要手動管理這個引用數組,或者考慮使用其他模式(如?key?+ 計算屬性)。
    <template><div v-for="(item, index) in list" :key="item.id" :ref="el => divs[index] = el">{{ item.text }}</div>
    </template><script setup>
    import { ref, reactive, onBeforeUpdate } from 'vue'const list = ref([{ id: 1, text: 'A' }, { id: 2, text: 'B' }])// 使用函數式 ref 回調來更靈活地收集引用
    const divs = ref([])// 在每次更新前重置引用數組,避免殘留
    onBeforeUpdate(() => {divs.value = []
    })
    </script>
  6. 函數式 ref

    • 除了字符串?ref="xxx",你還可以傳遞一個函數?:ref="callback"。這個函數會在每次組件更新時被調用,接收 DOM 元素或組件實例作為參數。這在需要更精細控制引用收集邏輯時非常有用(如上面?v-for?的例子)。
    <template><input :ref="(el) => inputElement = el" />
    </template><script setup>
    import { ref } from 'vue'const inputElement = ref(null) // 函數內部會設置它// 或者更復雜的邏輯
    const setupInputRef = (el) => {if (el) {// 元素被掛載inputElement.value = el// 可以在這里做初始化操作} else {// 元素被卸載inputElement.value = null}
    }
    </script>
  7. TypeScript 支持

    • 在 TypeScript 中,你可以為模板引用提供精確的類型。
    <script setup lang="ts">
    import { ref, onMounted } from 'vue'
    import ChildComponent from './ChildComponent.vue'// 為 DOM 元素引用提供類型
    const inputRef = ref<HTMLInputElement | null>(null)// 為子組件引用提供類型 (需要導入組件類型)
    const childRef = ref<InstanceType<typeof ChildComponent> | null>(null)onMounted(() => {if (inputRef.value) {inputRef.value.focus() // TypeScript 知道這是 HTMLInputElement}if (childRef.value) {childRef.value.increment() // TypeScript 知道可以調用 increment}
    })
    </script>

Vue 3 的模板引用 (ref) 是一個強大且常用的特性,用于在父組件中直接操作 DOM 或子組件。核心是:

  1. 在模板中使用?ref="myName"
  2. 在?<script setup>?中使用?const myName = ref(null)?定義響應式引用。
  3. 在?onMounted?或之后訪問?myName.value?來獲取 DOM 元素或組件實例。
  4. 對于子組件,使用?defineExpose?來控制暴露的 API。
  5. 在?v-for?中使用時,引用是數組,需注意更新時機。
  6. 在 TypeScript 中提供精確類型。

原則:盡量通過響應式數據和 props/events 來進行組件通信,僅在確實需要直接 DOM 操作或調用特定方法時才使用模板引用。

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

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

相關文章

模式匹配自動機全面理論分析

模式匹配是什么 模式匹配是計算機科學中一個基礎且重要的問題&#xff0c;廣泛應用于文本編輯、信息檢索、網絡安全、生物信息學等多個領域。簡單來說&#xff0c;模式匹配就是在一個主文本中查找一個或多個特定模式串的出現位置。隨著計算機處理能力的提升和數據規模的擴大&am…

AI 搜索時代:引領變革,重塑您的 SEO 戰略

隨著谷歌轉向人工智能驅動的答案&#xff0c;使用以關鍵字和反向鏈接為中心的過時和傳統的 SEO 策略不再起到任何作用。 由于 Google AI Overviews 和零點擊搜索的興起&#xff0c;自然點擊量正在下降&#xff0c;用戶無需點擊任何網站即可直接在 Google 的搜索結果頁面上獲得答…

【網站深入seo方法】

目錄 ①對于更成熟的網站&#xff0c;簡單的index.html的入口文件的seo已經無法滿足&#xff0c;需要在商品詳情不同商品被搜索時賦予不同的title和description。 ②通過設置站點所有頁面都新增Canonical標簽&#xff0c;指定規范鏈接地址給谷歌并規避聯盟的重復內容頁面。 ③…

ROS move_base 混合功能導航 RealSense D435i + 3D 點云地圖 + 樓層切換 + 路徑錄制 + 路徑規劃

Mixed-Navigation 這個博客也是記錄我們的一個開源項目&#xff0c;其作用是混合功能導航。由于現有的 Fast-Lio-Localization 只實現了定位功能&#xff0c;但對于路徑規劃和樓層切換沒有具體實現&#xff0c;因此我們開出了這個倉庫作為參考。該倉庫的核心功能如下&#xff…

初識c語言————宏定義和調用

目錄&#xff1a;一.不帶參數的宏二.帶參數宏一.不帶參數的宏不帶參數的宏是指用#define指令定義的簡單文本替換規則&#xff0c;它沒有參數列表&#xff0c;直接替換標識符為相應的文本其一般形式為&#xff1a;#define 宏名 文本例如&#xff1a;#define pi 3.14這個代…

數據結構:滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Complete Binary Tree)

目錄 重要的術語澄清 完美二叉樹 (Perfect Binary Tree) 完全二叉樹 (Complete Binary Tree) 大比拼 (Comparison) 相互關系的第一性推導 我們來深入探討兩種在算法中非常重要的、具有特定“形狀”的二叉樹&#xff1a;滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Compl…

OpenJDK 17的C1和C2編譯器實現中,方法返回前插入安全點(Safepoint Poll)的機制

OpenJDK 17 JIT編譯器堆棧分析-CSDN博客 在OpenJDK 17的C1和C2編譯器實現中&#xff0c;方法返回前插入安全點&#xff08;Safepoint Poll&#xff09;的機制主要涉及以下關鍵步驟&#xff0c;結合源代碼進行分析&#xff1a; 1. 安全點輪詢樁&#xff08;Safepoint Poll Stu…

【論文筆記】STORYWRITER: A Multi-Agent Framework for Long Story Generation

論文信息 論文標題&#xff1a;StoryWriter: A Multi-Agent Framework for Long Story Generation 論文作者&#xff1a;Haotian Xia, Hao Peng et al. (Tsinghua University) 論文鏈接&#xff1a;https://arxiv.org/abs/2506.16445 代碼鏈接&#xff1a;https://github.com/…

Cohere 開發企業級大型語言模型(LLM)

Cohere 是一家專注于開發企業級大型語言模型&#xff08;LLM&#xff09;的公司。該公司推出了一系列名為 “Command” 的模型&#xff0c;其中最強大的 “Command A” 于今年三月首次亮相 Cohere 還提供嵌入模型&#xff0c;這是一種將文件轉化為神經網絡可以理解的緊湊數值形…

Rust Web框架Axum學習指南之入門初體驗

一、準備階段 確保已經安裝 rust&#xff0c;開發環境使用 vscode 或者 rustrover 都可以。接著就可以創建項目&#xff0c;通過編輯器創建或者命令行創建都可以&#xff1a; cargo new axum-admin二、添加依賴 添加依賴如下&#xff1a; [package] name "axum-admin&quo…

autofit.js: 自動調整HTML元素大小的JavaScript庫

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

RocketMQ 命名服務器(NameServer)詳解

&#x1f680; RocketMQ 命名服務器&#xff08;NameServer&#xff09;詳解 NameServer 是 RocketMQ 架構中的輕量級路由發現服務&#xff0c;它不參與消息的收發&#xff0c;但承擔著整個集群的“地址簿”和“導航系統”的關鍵角色。 理解 NameServer 的設計與工作原理&#…

代碼隨想錄算法訓練營四十三天|圖論part01

深度優先搜索&#xff08;dfs&#xff09;理論基礎 dfs就是可一個方向去搜直到盡頭再換方向&#xff0c;換方向的過程就涉及到了回溯。 代碼框架 因為dfs搜索可一個方向&#xff0c;并需要回溯&#xff0c;所以用遞歸的方式來實現是最方便的。 先來回顧一下回溯法的代碼框架…

飛算JavaAI金融風控場景實踐:從實時監測到智能決策的全鏈路安全防護

目錄一、金融風控核心場景的技術突破1.1 實時交易風險監測系統1.1.1 高并發交易數據處理1.2 智能反欺詐系統架構1.2.1 多維度欺詐風險識別1.3 動態風控規則引擎1.3.1 風控規則動態管理二、金融風控系統效能升級實踐2.1 風控模型迭代加速機制2.1.1 自動化特征工程結語&#xff1…

Vue 組件二次封裝透傳slots、refs、attrs、listeners

最近寫了一個開源項目&#xff0c;有些地方需要二次封裝&#xff0c;需要透傳一些數據&#xff0c;需要注意的是ref&#xff0c;我這里使用倆種方式間接傳遞ref&#xff0c;具體如下&#xff1a; 使用&#xff1a; import VideoPlayer from ./index.jsVue.use(VideoPlayer)inde…

介紹大根堆小根堆

文章目錄一、核心定義與結構特性示例&#xff08;以“數組存儲堆”為例&#xff09;二、堆的兩個核心操作1. 插入操作&#xff08;以小根堆為例&#xff09;2. 刪除極值操作&#xff08;以小根堆為例&#xff0c;刪除根節點的最小值&#xff09;三、小根堆 vs 大根堆&#xff1…

【Html網頁模板】賽博朋克數據分析大屏網頁

目錄專欄導讀? 項目概述&#x1f3a8; 設計理念&#x1f6e0;? 技術架構核心技術棧設計模式&#x1f3af; 核心功能1. 視覺效果系統&#x1f308; 色彩體系2. 數據可視化模塊&#x1f4ca; 主圖表系統&#x1f4c8; 性能監控面板3. 實時數據流系統? 數據流動畫&#x1f4ca;…

【經典上穿突破】副圖/選股指標,雙均線交叉原理,對價格波動反應靈敏,適合捕捉短期啟動點

【經典上穿突破】副圖/選股指標&#xff0c;雙均線交叉原理&#xff0c;對價格波動反應靈敏&#xff0c;適合捕捉短期啟動點 這是一款結合短線與中線信號的趨勢跟蹤指標&#xff0c;通過雙均線交叉原理捕捉股價突破時機&#xff0c;適用于個股分析和盤中選股。 核心功能模塊&…

RK3568 NPU RKNN(四):RKNN-ToolKit2性能和內存評估

文章目錄1、前言2、目標3、完整的測試程序4、運行測試程序5、程序拆解6、總結1、前言 本文僅記錄本人學習過程&#xff0c;不具備教學指導意義。 2、目標 使用野火提供的示例程序&#xff0c;體驗 RKNN-ToolKit2 在PC端使用連板推理&#xff0c;進行性能和內存評估。 3、完…

ASP.NET 上傳文件安全檢測方案

一、前端初步過濾&#xff08;防誤操作&#xff09;<!-- HTML部分 --><input type"file" id"fileUpload" accept".jpg,.png,.pdf,.docx" /><button onclick"validateFile()">上傳</button><script>func…