vue中ref的詳解以及react的ref對比

文章目錄

  • 1. ref是什么
  • 2. ref的使用
  • 3. ref的特性
  • 4. 使用場景
  • 5. 注意事項
  • 6. 與 React 的對比
  • 7. 動態 ref
  • 8. 函數式組件中的 ref
  • 9. 組合式 API 中的 ref
  • 10. 總結

1. ref是什么

ref 被用來給元素或子組件注冊引用信息。引用信息將會注冊在父組件的 $refs 對象上。可以通過實例對象獲取到后進行一些操作。

  • 如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素
<div ref="divRef">hello</div>
  • 如果用在子組件上,引用就指向組件實例
<list-component ref="listRef"></list-component>
  • 如果在v-for循環中使用了ref,引用指向的就是數組類型。
<div v-for="item in list" :ref="item.xxx"></div>

2. ref的使用

在給組件綁定ref=xxx的屬性后,通過this.$refs.xxx,就可以獲取到組件的實例,進而可以操作組件的方法,獲取到屬性,如下例子,通過獲取到list組件的實例,得到了組件內部的xxx屬性。

  • 普通ref
<list-component ref="listRef"></list-component>console.log(this.$refs.listRef.xxx)
  • 循環里的ref

如果在v-for循環中使用了ref,引用指向的就是數組類型,為了確保唯一性,可以使用id拼接的方式。

<div v-for="item in list" :ref="`ref${item.id}`"></div>console.log(this.$refs[`ref${item.id}`])

3. ref的特性

  • 非響應式$refs 對象不會觸發視圖更新,即便引用的元素或者組件有了變化。
  • 延遲更新$refs 是在 DOM 更新結束之后才會進行更新的,所以在初始化階段或者數據變更時,直接訪問 $refs 可能無法獲取到最新的引用。
  • 生命周期鉤子:在 mounted 鉤子函數里訪問 $refs 是比較穩妥的,因為這時 DOM 已經完成了首次渲染。

4. 使用場景

  • DOM 操作
  // 聚焦輸入框this.$refs.inputRef.focus()// 滾動到特定元素this.$refs.scrollContainer.scrollTop = 100
  • 調用子組件方法
  // 調用子組件的刷新方法this.$refs.childComponent.refreshData()
  • 訪問子組件屬性
  // 獲取子組件的內部狀態const count = this.$refs.counterComponent.count

5. 注意事項

  • 避免濫用:應當優先考慮使用數據綁定或者事件機制來實現組件間的通信,只有在確實需要直接操作 DOM 或者組件實例時才使用 ref
  • 異步更新:由于 Vue 的 DOM 更新是異步進行的,所以在修改數據之后立即訪問 $refs 可能無法獲取到更新后的 DOM。這種情況下,可以使用 this.$nextTick() 來確保 DOM 已經更新完畢。
    this.list = [...newList]
    this.$nextTick(() => {// 此時可以獲取到更新后的 ref 列表console.log(this.$refs.itemRefs)
    })
    

6. 與 React 的對比

在 React 中,ref 的使用方式和 Vue 既有相似之處,也存在差異:

  • 創建方式

    // Vue
    <div ref="myDiv"></div>// React
    <div ref={this.myRef}></div>
    
  • 類型區別

    • 在 Vue 里,ref 可以直接指向 DOM 元素或者組件實例。
    • 在 React 中,ref 可以是一個回調函數,也可以是通過 createRef() 創建的對象。
  • 訪問方法

    // Vue
    this.$refs.myDiv// React
    this.myRef.current
    

7. 動態 ref

借助動態綁定的方式,可以實現 ref 的動態管理:

<component :ref="dynamicRefName"></component>// 在不同條件下使用不同的 ref
this.dynamicRefName = condition ? 'refA' : 'refB'

8. 函數式組件中的 ref

函數式組件沒有自己的實例,所以在使用 ref 時會指向其渲染的根節點:

// 函數式組件
const FunctionalComp = {functional: true,render(h, context) {return <div>Functional Component</div>}
}// 使用 ref 獲取根 DOM
<FunctionalComp ref="funcRef" />
this.$refs.funcRef // 指向 <div> 元素

9. 組合式 API 中的 ref

在組合式 API 里,可以通過 defineExpose 來暴露組件的屬性和方法:

<template><button ref="btnRef" @click="handleClick">Click</button>
</template><script setup>
import { ref, onMounted } from 'vue'const btnRef = ref(null)const handleClick = () => {console.log('Button clicked')
}// 暴露給父組件
defineExpose({handleClick
})onMounted(() => {btnRef.value.focus()
})
</script>

10. 總結

  • ref 是 Vue 提供的一種直接操作 DOM 或者組件實例的方式。
  • 要注意 ref 的非響應式特性以及延遲更新的特點。
  • 建議在必要的場景下使用 ref,并優先采用聲明式的數據綁定。
  • 在組合式 API 中,可以使用 defineExpose 有選擇性地暴露組件的方法和屬性。

本次分享就到這兒啦,我是鵬多多,如果您看了覺得有幫助,歡迎評論,關注,點贊,轉發,我們下次見~

往期文章

  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • Web前端頁面開發阿拉伯語種適配指南
  • flutter-使用extended_image操作圖片的加載和狀態處理以及緩存和下載
  • flutter-制作可縮放底部彈出抽屜評論區效果
  • flutter-實現Tabs吸頂的PageView效果
  • Vue2全家桶+Element搭建的PC端在線音樂網站
  • 助你上手Vue3全家桶之Vue3教程
  • 超詳細!vue組件通信的10種方式
  • 超詳細!Vuex手把手教程
  • 使用nvm管理node.js版本以及更換npm淘寶鏡像源
  • vue中利用.env文件存儲全局環境變量,以及配置vue啟動和打包命令

個人主頁

  • CSDN
  • GitHub
  • 掘金

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

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

相關文章

通過ca證書的方式設置允許遠程訪問Docker服務

設置允許遠程訪問Docker服務 使用場景 環境 系統&#xff1a;anolis7.9 修改Docker服務配置&#xff0c;配置安全證書 生成ca證書到/etc/docker目錄中&#xff0c;后續會要用到 #該步驟需要設置密碼&#xff0c;后面步驟會要用到&#xff0c;此處設置密碼為123456 openss…

Qt Quick Layout功能及架構

Qt Quick Layouts 是 Qt Quick 中用于管理用戶界面布局的模塊&#xff0c;在 Qt 6.0 中繼續提供強大的布局管理功能。 一、主要功能 主要布局類型 RowLayout - 水平排列項目 ColumnLayout - 垂直排列項目 GridLayout - 網格排列項目 StackLayout - 堆疊項目&#xff08;一…

Golang 面試經典題:map 的 key 可以是什么類型?哪些不可以?

Golang 面試經典題&#xff1a;map 的 key 可以是什么類型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面試中&#xff0c;map 類型的使用是一個常見的考點&#xff0c;其中對 key 類型的合法性 是一道常被提及的基礎卻很容易被忽視的問題。本文將帶你深入理解 Golang 中…

從 ClickHouse、Druid、Kylin 到 Doris:網易云音樂 PB 級實時分析平臺降本增效

網易云音樂基于 Apache Doris 替換了早期架構中 Kylin、Druid、Clickhouse、Elasticsearch、HBase 等引擎&#xff0c;統一了實時分析架構&#xff0c;并廣泛應用于廣告實時數倉、日志平臺和會員報表分析等典型場景中&#xff0c;帶來導入性能提升 3&#xff5e;30 倍&#xff…

Android 本地存儲路徑說明

一、背景 作為一個開發者,我們經常需要通過緩存一些文件到SD卡中,常見的方式就是,通過: File sdCard Environment.getExternalStorageDirectory(); 獲取SD卡根目錄,然后自定義文件/文件名進行文件存儲.這樣做法的結果就是,當手機安裝了大量的app時&#xff0c;SD卡根目錄會…

開發的幾種格式,TCP的十個重要機制

自定義協議中&#xff0c; 我們有幾種常見的數據格式&#xff1a; 1.xml 通過標簽來組織數據 請求&#xff1a; 優勢&#xff1a; 讓數據的可讀性變更好了 劣勢&#xff1a; 標簽非常繁瑣&#xff0c;傳輸的時候也占用更多網絡帶寬&#xff08;maven會使用xml來管理項目配…

dify打造數據可視化圖表

一、概述 在日常工作和學習中&#xff0c;我們經常需要和數據打交道。無論是分析報告、項目展示&#xff0c;還是簡單的數據洞察&#xff0c;一個清晰直觀的圖表&#xff0c;往往能勝過千言萬語。 一款能讓數據可視化變得超級簡單的 MCP Server&#xff0c;由螞蟻集團 AntV 團隊…

自然語言處理——文本分類

文本分類 傳統機器學習方法文本表示向量空間模型 特征選擇文檔頻率互信息信息增益&#xff08;IG&#xff09; 分類器設計貝葉斯理論&#xff1a;線性判別函數 文本分類性能評估P-R曲線ROC曲線 將文本文檔或句子分類為預定義的類或類別&#xff0c; 有單標簽多類別文本分類和多…

任務調度器-關于中心化調度 vs 去中心化調度的核心區別

1. 定義與架構模型 維度中心化調度去中心化調度核心角色存在一個中央調度器&#xff08;如XXL-JOB的調度中心&#xff09;&#xff0c;統一管理任務分配、狀態監控和故障處理。無中心節點&#xff0c;調度邏輯分散在多個節點&#xff0c;通過共識算法&#xff08;如選舉機制&a…

[論文閱讀] 人工智能+軟件工程 | 結對編程中的知識轉移新圖景

當AI成為編程搭檔&#xff1a;結對編程中的知識轉移新圖景 論文信息 論文標題&#xff1a;From Developer Pairs to AI Copilots: A Comparative Study on Knowledge Transfer&#xff08;從開發者結對到AI副駕駛&#xff1a;知識轉移的對比研究&#xff09; 作者及機構&#…

CAD多面體密堆積3D插件

插件介紹 CAD多面體密堆積3D插件可在AutoCAD內建立三維隨機多面體密堆積模型。 插件內置物理動力學模擬算法&#xff0c;通過模擬重力、碰撞等現象&#xff0c;使多面體在虛擬環境中發生自然堆積&#xff0c;進而實現真實的堆積效果。多面體堆積模擬中存在的局部穿模問題可通…

VSCode CUDA C++進行Linux遠程開發

環境準備 確保在本地和遠程Linux服務器上安裝了以下軟件&#xff1a; Visual Studio Code&#xff08;簡稱VS Code&#xff09;Remote Development extension pack for VS CodeCUDA Toolkit&#xff0c;推薦版本為11.0或更高GCC編譯器&#xff0c;用于C代碼的編譯 此外&…

Python爬蟲(一):爬蟲偽裝

一、網站防爬機制概述 在當今互聯網環境中&#xff0c;具有一定規模或盈利性質的網站幾乎都實施了各種防爬措施。這些措施主要分為兩大類&#xff1a; 身份驗證機制&#xff1a;直接將未經授權的爬蟲阻擋在外反爬技術體系&#xff1a;通過各種技術手段增加爬蟲獲取數據的難度…

快速使用 Flutter Card 組件指南

目錄 一、引言 二、Card 的基本用法 三、主要屬性 3.1 elevation (陰影高度) 3.2 shape (形狀) 3.3 color (顏色) 3.4 margin (外邊距) 3.5 完整示例 四、結合 ListTile 組件使用 五、帶圖片的 Card 示例 六、注意事項 相關推薦 一、引言 Card 是 Flutter 提供的一個…

C語言內存管理和編譯優化實戰

參考&#xff1a; C語言內存管理“玄學”&#xff1a;從崩潰到精通的避坑指南C語言編譯優化實戰&#xff1a;從入門到進階的高效代碼優化技巧

【產品業務設計】支付業務設計規范細節記錄,含訂單記錄、支付業務記錄、支付流水記錄、退款業務記錄

【產品業務設計】支付業務設計規范細節記錄&#xff0c;含訂單記錄、支付業務記錄、支付流水記錄 前言 我為什么要寫這個篇文章 總結設計經驗生成設計模板方便后期快速搭建 一個幾張表 一共5張表&#xff1b; 分別是&#xff1a; 訂單主表&#xff1a;jjy_orderMain訂單產…

CppCon 2015 學習:Live Lock-Free or Deadlock

這段內容是介紹一場關于**“實用無鎖編程&#xff08;Practical Lock-Free Programming&#xff09;”**的講座提綱&#xff0c;重點在C中的并發編程。下面是詳細的中文理解和分析&#xff1a; 講座大綱和內容理解 主題概覽 適當的“guru崇拜”和“祈求” → 開場調侃&#…

centos7編譯安裝LNMP架構

一、LNMP概念 LNMP架構是一種常見的網站服務器架構&#xff0c;由Linux操作系統、Nginx Web服務器、MySQL數據庫和PHP后端腳本語言組成。 1 用戶請求&#xff1a;用戶通過瀏覽器輸入網址&#xff0c;請求發送到Nginx Web服務器。 2 Nginx處理&#xff1a;Nginx接收請求后&…

Spark 寫文件

Repartition Spark 輸出文件數量 假設每個 Task 的輸出數據都包含了全部 8 個分區值,那么最終的文件生成情況如下: 總文件數 = Task 數量 分區組合數 假設: ?Task 數量?:200 ?分區組合數?:8 個 (from_cluster 和 ds 的組合) 則: ?總文件數?:200 8 = ?1600 …

自定義protoc-gen-go生成Go結構體,統一字段命名與JSON標簽風格

背景 在日常的 Go 微服務開發中&#xff0c;Protocol Buffers&#xff08;protobuf&#xff09; 是廣泛使用的數據交換格式。其配套工具 protoc-gen-go 會根據 .proto 文件生成 Go 結構體代碼&#xff0c;但默認生成的字段名、JSON tag 命名風格往往不能滿足所有團隊或項目的代…