1.在vue中獲取dom推薦使用$refs
來獲取,可是有時會出現 this.$refs.xxx
為undefined的情況。
-
場景1:在created()里使用
在這個生命周期中進行數據觀測 ,屬性和方法的運算,watch 事件回調。但是頁面還沒有掛載上去,沒有e l 屬 性 , t h i s . el 屬性,this.el屬性,this.refs無法調用dom。
解決辦法:換成在mounted()里使用 -
場景2:父元素或當前元素使用了v-if或v-show
因為$refs不是響應式的,只在組件渲染完成后才會生效,在初始渲染的時候是不存在的。
因為是非響應式的,所有動態加載的模板更新它都無法相應的變化。
解決辦法:可以通過setTimeout(()=>{…}, 0)來實現。
2.如果使用v-for 遍歷加ref時可以使用 :
,即 :ref ="variable"
,這樣得到的是不同的ref。
<div v-for="(item,index) in arr" :key="index"> <child :ref="`refName${index}`"/> </div> //this.$refs[`refName${index}`]每一項都是一個僅包含一個元素的數組 this.$refs[`refName${index}`][0].fun();//調用第一個組件內的方法
但是也可以不使用 :
,這時得到的 ref 將會是一個包含了對應數據源的這些子組件的數組。
<div v-for="(item,index) in arr" :key="index"> <child ref="refName"/> </div> //this.$refs.refName是一個包含了對應數據源的這些子組件的數組 this.$refs.refName[0].fun();//調用第一個組件內的方法