關於Vue中的ref和 refs的二三事

2022-07-15 17:39:15 字數 3567 閱讀 8862

vue中的ref可以用來給元素或子元件註冊引用資訊,而$refs可以用來獲取ref註冊過的元素或元件,關於這一點概念,其實很容易理解,使用一下就可以上手了,詳細的概念參見 [vue-ref]

[vue-$refs]

但是在實際專案中,會發現,有時候通過this.$refs.ref名稱來獲取對應的dom或元件時,並不能成功,而要在後面加乙個[0]才能成功獲取到。多留心一下,會發現好像是涉及到迴圈時,就會出現這種情況,那不如來多做幾組測試來驗證一下,順便試試各種特殊情況下的特別之處。

太長了,我要直接看結論

part 1 常規用法

當ref用在元件上時,通過$refs獲取的是該元件的例項,可進而呼叫元件內定義的方法、屬性等;

如下圖所示,當ref定義在元件home上時,通過this.$refs.test獲取的是home元件對應的例項物件,通常我們可以通過這種方式來呼叫某個元件內的methods、data中定義的資料、或是進而獲取其子元件等。

ref="test" />

div>

template>

import

home

from

'./views/home'

export

default

, mounted ()

}script>

當ref用在dom節點上時,通過$refs獲取的是該dom元素節點。

如下圖所示,當ref定義在dom元素上時,通過this.$refs.test獲取的是該dom元素,且包含子元素,進而可以進行下一步的dom操作。

ref="test">

123span>

p>

div>

template>

export default

}script>

part 2 多處ref引用的值相同時(非v-for內使用時)

當html中ref值相同的節點是兄弟節點時,通過$refs獲取到的是文件中順序靠下的節點(使用在dom上和元件上原則一致,以dom為例)

ref="test">

123span>

p>

ref="test">456span>

div>

template>

export default

}script>

當html中ref值相同的節點是巢狀關係時,比如父子關係,則通過$refs獲取到的是外層節點(使用在dom上和元件上原則一致,以dom為例)

ref="test">

ref="test">123span>

p>

div>

template>

export default

}script>

當html中ref值相同的節點不在同一層級,也不是巢狀關係時,仍然遵循文件中順序靠下的節點被獲取的原則(使用在dom上和元件上原則一致,以dom為例)

ref="test">456p>

ref="test">123span>

p>

div>

template>

export default

}script>

part 3 當ref值是個變數時(非v-for內使用時)

ref值使用變數時,通過this.$refs[變數名稱]指向的依舊是該dom節點或元件例項,不需要加[0],且當出現ref值重複時,仍然滿足part2實踐中的原則

123span>

p>

div>

template>

export default

},mounted ()

}script>

part 4 ref用在v-for上時

當ref值相同時,this.$refs[ref名稱]獲取到的是該dom節點或元件的陣列,此處以元件為例

v-for="num

inloop" :key="num" ref="test">home>

div>

template>

import

home

from

'./views/home'

export default

, data ()

},mounted ()

}script>

當ref值不同時,this.$refs[ref名稱]無法獲取對應的dom節點或是元件,需要在其後追加[0]才可訪問,此處以元件為例

v-for="num

inloop" :key="num" :ref="'test' + num">home>

div>

template>

import

home

from

'./views/home'

export default

, data ()

},mounted ()

}script>

總結:

1. ref用在dom上時,通過this.$refs[ref名稱]訪問的是該dom元素節點;ref用在元件上時,通過this.$refs[ref名稱]訪問的是該元件的例項物件,可以進而呼叫元件的方法或者獲取元件的屬性等;

2. 當同一元件內部,有多處ref引用值相同的情況時,this.$refs[ref名稱]指向文件流中靠下的元件或dom節點,若是父子關係,則指向父級元件或dom節點;

3. 若ref的值是個變數,只要不是用在v-for裡,通過this.$refs[變數名稱]指向的依舊是該dom節點或元件例項,且當出現ref值重複時,仍然滿足取靠下的節點或是父級節點的規則;

4. 若ref用在v-for裡,當迴圈內的ref值相同時,this.$refs[ref名稱]獲取到的是該dom節點或元件的陣列,當ref值不同時,需提供this.$refs[ref名稱][0]來獲取該dom節點或元件例項。

以上各項實踐可能考慮的情況不一定全,若是有遇到其他情況出現不一樣的用法和結果,再進行補充。

Vue中ref和 refs學習筆記

js中需要通過document.queryselector demo 來獲取dom節點,然後再獲取這個節點的值。在vue中,我們不用獲取dom節點,元素繫結ref之後,直接通過this.refs即可呼叫,這樣可以減少獲取dom節點的消耗。ref介紹 ref被用來給元素或者子元件註冊引用資訊。引用資訊...

Vue 中的 ref 和 refs 的使用

在vue中一般很少直接操作dom,如果需要操作dom,我們可以通過ref 和 ref來實現。ref 被用來給元素或子元件註冊引用資訊,引用資訊將會註冊在父元件的 refs 物件上,如果是在普通的 dom元素上使用,引用指向的就是 dom 元素,如果是在子元件上,引用就指向元件的例項。當在子元件或者d...

vue之 ref 和 refs的使用

在vue中一般很少直接操作dom,如果需要操作dom,我們可以通過ref 和 ref來實現。ref 被用來給元素或子元件註冊引用資訊,引用資訊將會註冊在父元件的 refs 物件上,如果是在普通的dom元素上使用,引用指向的就是 dom 元素,如果是在子元件上,引用就指向元件的例項。當在子元件或者do...