一文詳解Vue3中使用ref獲取元素節(jié)點(diǎn)
前言:
本文介紹在vue3
的setup
中使用composition API
獲取元素節(jié)點(diǎn)的幾種方法:
靜態(tài)綁定
僅僅需要申明一個(gè)ref
的引用,用來保存元素,在template
中,不必bind
引用(:ref="domRef"
),只需要聲明一個(gè)同名的ref
屬性(ref="domRef"
)即可。
<script?setup> import?{?ref,?onMounted?}?from?'vue' //?聲明一個(gè)ref引用,來保存元素 const?domRef?=?ref(null) onMounted(()?=>?{ ??domRef.value.style.background?=?"red" }) </script> <template> ??<!--?這里只需要同名即可?--> ??<button?ref="domRef">dom</button> </template>
需要注意的是,訪問的時(shí)候,要確保ref
引用值已經(jīng)成功綁定上元素,我們可以使用以下幾種方式確保獲?。?/strong>
onMounted
onMounted(()?=>?{ ??domRef.value.style.background?=?"red" })
nextTick
nextTick(()?=>?{ ??domRef.value.style.background?=?"red" })
watchEffect
watchEffect(()?=>?{ ???if?(domRef.value)?{ ????????domRef.value.style.background?=?"red" ???} })
watch
watch(domRef,?(val)?=>?{ ????domRef.value.style.background?=?"red" })
v-for中使用
在使用v-for
進(jìn)行靜態(tài)綁定時(shí),僅需要注意以下兩點(diǎn):
- 要與
v-for
在同級(jí) ref
是一個(gè)數(shù)組ref([])
<script?setup> import?{?ref,?onMounted?}?from?'vue' const?list?=?ref([ ??/*?...?*/ ]) const?itemRefs?=?ref([]) onMounted(()?=>?console.log(itemRefs.value)) </script> <template> ??<ul> ????<li?v-for="item?in?list"?ref="itemRefs"> ??????{{?item?}} ????</li> ??</ul> </template>
但需要注意的是,itemRefs
元素?cái)?shù)組并不保證與list
數(shù)組為相同的順序。
動(dòng)態(tài)綁定
動(dòng)態(tài)綁定中,分為兩種方式,一種是通過將ref
設(shè)置為函數(shù),第二種則是通過getCurrentInstance
方法訪問當(dāng)前組件實(shí)例上的$refs
;
ref設(shè)置函數(shù)
<template> ????<button?:ref="handleRef">動(dòng)態(tài)Ref</button> </template> <script?setup> ????import?{?shallowRef?}?from?'vue' ???? ????const?btnRef?=?shallowRef(null) ????//?賦值動(dòng)態(tài)ref到變量 ????const?handleRef?=?el?=>?{ ????????if?(el)?{ ????????????btnRef.value?=?el ????????} ????} </script>
ref
的函數(shù)回調(diào)中,我們能夠接受到元素返回值,再動(dòng)態(tài)設(shè)置到響應(yīng)式變量即可;
當(dāng)然,通過設(shè)置函數(shù)回調(diào)的方式,我們也能非常靈活的進(jìn)行進(jìn)一步的封裝。
<template> ????<ul> ????????<li?v-for="item?in?list"?:key="item.id"?:ref="(el)?=>?handleLiRef(el,?item)"> ????????????<button>{{?item.id?}}</button> ????????</li> ????</ul> </template> <script?setup> ????import?{?ref?}?from?"vue" ????const?list?=?ref([{?id:?"111"?},?{?id:?"222"?},?{?id:?"333"?}]) ????const?handleLiRef?=?(el,?item)?=>?{ ????????console.log(el,?item) ????} </script>
通過getCurrentInstance方法
<template> ????<ul> ????????<li?v-for="item?in?list"?:key="item.id"?:ref="item.id"> ????????????<button>{{?item.id?}}</button> ????????</li> ????</ul> </template> <script?setup> ????import?{?getCurrentInstance,?onMounted,?ref?}?from?"vue" ????const?{?proxy?}?=?getCurrentInstance() ????const?list?=?ref([{?id:?"111"?},?{?id:?"222"?},?{?id:?"333"?}]) ????onMounted(()?=>?{ ????????console.log(proxy.$refs["111"]) ????}) </script>
這種方式,與vue2
的this.$refs
一般無二,只是我們用了getCurrentInstance
函數(shù)在setup
中獲取了當(dāng)前組件實(shí)例以替代this
。
獲取vue實(shí)例
需要注意的是,無論通過以上哪種方式獲取元素,如果元素為vue
組件,則需要在子組件中使用defineExpose
進(jìn)行暴露。
在父組件中,我們靜態(tài)綁定childRef
。
<template> ????<Test?ref="childRef"></Test> </template> <script?setup?lang="ts"> ????import?Test?from?"./components/test.vue" ????import?{?onMounted,?ref?}?from?"vue" ????const?childRef?=?ref(null) ????onMounted(()?=>?{ ????????console.log(childRef.value.btnRef) ????}) </script>
在子組件中,我們需要通過defineExpose
函數(shù),手動(dòng)暴露出來ref
引用值,該值指向了button
元素。
<template> ????<button?ref="btnRef">子組件</button> </template>
<script?setup> ????import?{?ref?}?from?"vue" ????const?btnRef?=?ref(null) ????defineExpose({ ????????btnRef ????}) </script>
到此這篇關(guān)于一文詳解Vue3中使用ref獲取元素節(jié)點(diǎn)的文章就介紹到這了,更多相關(guān)Vue3 ref 獲取元素節(jié)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue 使用v-if切換輸入框時(shí)導(dǎo)致輸入框的數(shù)據(jù)內(nèi)容沒有清空的問題解決(兩種解決方法)
這篇文章主要介紹了vue 使用v-if切換輸入框時(shí)導(dǎo)致輸入框的數(shù)據(jù)內(nèi)容沒有清空的問題解決,本文給大家分享兩種解決方法,需要的朋友可以參考下2023-05-05vue解決刷新頁面時(shí)會(huì)出現(xiàn)變量閃爍的問題
這篇文章主要介紹了vue解決刷新頁面時(shí)會(huì)出現(xiàn)變量閃爍的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Vue中對(duì)拿到的數(shù)據(jù)進(jìn)行A-Z排序的實(shí)例
今天小編就為大家分享一篇Vue中對(duì)拿到的數(shù)據(jù)進(jìn)行A-Z排序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09Vue.config.js配置報(bào)錯(cuò)ValidationError:?Invalid?options?object解
這篇文章主要給大家介紹了關(guān)于Vue.config.js配置報(bào)錯(cuò)ValidationError:?Invalid?options?object的解決辦法,主要由于vue.config.js配置文件錯(cuò)誤導(dǎo)致的,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02vue element-ui中table合計(jì)指定列求和實(shí)例
這篇文章主要介紹了vue element-ui中table合計(jì)指定列求和實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11vue+vue-router轉(zhuǎn)場(chǎng)動(dòng)畫的實(shí)例代碼
今天小編就為大家分享一篇vue+vue-router轉(zhuǎn)場(chǎng)動(dòng)畫的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue中全局路由守衛(wèi)中替代this操作(this.$store/this.$vux)
這篇文章主要介紹了vue中全局路由守衛(wèi)中替代this操作(this.$store/this.$vux),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07在Vue項(xiàng)目中用fullcalendar制作日程表的示例代碼
這篇文章主要介紹了在Vue項(xiàng)目中用fullcalendar制作日程表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08一次vue項(xiàng)目?jī)?yōu)化的實(shí)際操作記錄
用vue開發(fā)項(xiàng)目上線以后,發(fā)現(xiàn)首頁加載速度非常慢,如果項(xiàng)目比較大,甚至可能出現(xiàn)10s以上的等待,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目?jī)?yōu)化的相關(guān)資料,需要的朋友可以參考下2022-09-09