<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
本文介紹在vue3
的setup
中使用composition API
獲取元素節點的幾種方法:
僅僅需要申明一個ref
的參照,用來儲存元素,在template
中,不必bind
參照(:ref="domRef"
),只需要宣告一個同名的ref
屬性(ref="domRef"
)即可。
<script setup> import { ref, onMounted } from 'vue' // 宣告一個ref參照,來儲存元素 const domRef = ref(null) onMounted(() => { domRef.value.style.background = "red" }) </script> <template> <!-- 這裡只需要同名即可 --> <button ref="domRef">dom</button> </template>
需要注意的是,存取的時候,要確保ref
參照值已經成功繫結上元素,我們可以使用以下幾種方式確保獲取:
onMounted(() => { domRef.value.style.background = "red" })
nextTick(() => { domRef.value.style.background = "red" })
watchEffect(() => { if (domRef.value) { domRef.value.style.background = "red" } })
watch(domRef, (val) => { domRef.value.style.background = "red" })
在使用v-for
進行靜態繫結時,僅需要注意以下兩點:
v-for
在同級ref
是一個陣列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
元素陣列並不保證與list
陣列為相同的順序。
動態繫結中,分為兩種方式,一種是通過將ref
設定為函數,第二種則是通過getCurrentInstance
方法存取當前元件範例上的$refs
;
<template> <button :ref="handleRef">動態Ref</button> </template> <script setup> import { shallowRef } from 'vue' const btnRef = shallowRef(null) // 賦值動態ref到變數 const handleRef = el => { if (el) { btnRef.value = el } } </script>
ref
的函數回撥中,我們能夠接受到元素返回值,再動態設定到響應式變數即可;
當然,通過設定函數回撥的方式,我們也能非常靈活的進行進一步的封裝。
<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>
<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
函數在setup
中獲取了當前元件範例以替代this
。
需要注意的是,無論通過以上哪種方式獲取元素,如果元素為vue
元件,則需要在子元件中使用defineExpose
進行暴露。
在父元件中,我們靜態繫結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
函數,手動暴露出來ref
參照值,該值指向了button
元素。
<template> <button ref="btnRef">子元件</button> </template>
<script setup> import { ref } from "vue" const btnRef = ref(null) defineExpose({ btnRef }) </script>
到此這篇關於一文詳解Vue3中使用ref獲取元素節點的文章就介紹到這了,更多相關Vue3 ref 獲取元素節點內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45