在 Vue 中,我們常常需要引用 DOM 元素或組件實例,以便于進行數據處理或事件處理。這時,我們就需要使用到 ref 。在 Vue 中使用 ref 可以獲得對特定元素或組件實例的直接訪問。
在上述代碼中,通過設置 ref 屬性為 "inputElem",在組件實例被 mounted 之后,可以通過 this.$refs.inputElem 獲取到 input 元素,并可直接操作 DOM 元素。需要注意的是,通過 ref 獲取到的 DOM 元素是未經過任何包裹的裸露元素,不會被封裝為 Vue 組件實例,所以也就不具備 Vue 組件實例的屬性和方法。
除了在模板中使用 ref,也可以通過 this.$refs 對象直接設置 ref ,并且可以設置多個 ref 。此時,this.$refs 的值是一個由 ref 名稱作為屬性名,所對應的 DOM 元素或組件實例作為屬性值的對象。需要注意的是,組件實例的引用和 DOM 元素的引用都會被混雜在 this.$refs 對象中,所以在使用時需要區分開來。
需要注意的是,在類組件中使用 ref 必須使用箭頭函數,以保證 this 的指向正確。否則會因為 this 指向錯誤而無法獲取組件實例或 DOM 元素。事實上,在 Vue 中使用 ref 時,this 的指向始終是正確的。另外一個需要注意的點是,ref 在父組件中引用子組件實例時,只能在子組件被創建之后使用。也就是說,如果在組件的 created 階段中使用組件實例的 ref,將會得到 undefined 的值。
子組件
ref 是 Vue 中非常常用的一個特性,可以在組件之間進行數據傳遞和事件處理。但是,在使用 ref 時需要避免過度使用,通常情況下應該優先考慮使用 props 和 emit 進行組件之間的通信。ref 的使用與組件之間的解耦是矛盾的,如果過度使用 ref 會導致代碼的可維護性變差,也會讓代碼變得臃腫不堪。