1. 程式人生 > 實用技巧 >Vue3 特殊屬性:key,ref,is

Vue3 特殊屬性:key,ref,is

Vue3 特殊屬性:key,ref,is

參考文件:https://v3.vuejs.org/api/special-attributes.html

vue3 特殊屬性:

  • key
  • ref
  • is

key

期望值:number | string

特殊屬性key主要用於提示Vue的虛擬DOM演算法在區分新節點列表和舊節點列表時識別VNodes。沒有key的時候,Vue使用一種演算法來最小化元素移動,並儘可能就地修補/重用相同型別的元素。使用key,它將根據鍵的順序變化對元素重新排序,而key不再存在的元素將總是被刪除/銷燬。

同一公共父元素的子元素必須具有唯一的key,重複的key會導致渲染錯誤。

最常用的使用示例是和v-for一起使用。

<ul>
    <li v-for="item in items" :key="item.id">...</li>
</ul>

它還可以用於強制替換元素/元件,而不是重用它。當你想要的時候,這很有用:

  • 恰當地觸發元件的生命週期鉤子
  • 觸發transitions

示例:

<transition>
    <span :key="text">{{ text }}</span>
</transition>

當text改變,span將始終被替換,而不是修補,因此將觸發transition

ref

期望值:string | Function

ref用於註冊對元素或子元素的引用。引用將註冊在父元件的$refs物件下。如果在普通DOM元素上使用,引用將是該元素,如果在子元件上使用,引用將是元件例項

<!-- vm.$refs.p 就是這個DOM節點 -->
<p ref="p">hello</p>

<!-- vm.$refs.child 就是child-component這個元件例項 -->
<child-component ref="child"></child-component>

<!-- 當動態繫結,我們可以將ref定義為一個回撥函式,顯示地傳遞元素或元件例項 
--> <child-component :ref="(el) => child = el"></child-component>

關於ref註冊時間的一個重要提示:

因為ref本身是由render函式建立的,所以你不能在初始渲染時訪問它們——它們還不存在!

$refs也是非響應式的,因此不應該嘗試在資料繫結模板中使用它。

refs相關補充:

Template refs

儘管存在props和events,但有時您可能仍然需要在JavaScript中直接訪問子元件,要實現這一點,可以使用ref屬性作為子元件或HTML元素分配一個引用ID

<input ref="input" />

當你想以程式設計方式將這個輸入焦點放到元件掛載上,這可能是有用的。

const app = Vue.createApp({})

app.component('base-input', {
    template: `
        <input ref="input" />
    `,
    methods: {
        focusInput() {
            this.$refs.input.focus()
        }
    },
    mounted() {
        this.focusInput()
    }
})

此外,你可以新增另一個ref到元件本身,並使用它來觸發來自父元件的focusInput事件

<base-input ref="usernameInput"></base-input>
this.$refs.usernameInput.focusInput()

$refs只在元件呈現後填充,它只是作為直接操作子元件的口子——應該避免從模板或計算屬性中訪問$refs

is

期望值:string | Object(元件選項物件)

用於動態元件

例如:

<!-- 當currentView變化時,component改變 -->
<component :is="currentView"></component>