首頁  >  文章  >  web前端  >  vue中v-if和v-for哪個優先權高

vue中v-if和v-for哪個優先權高

青灯夜游
青灯夜游原創
2022-07-20 18:02:175120瀏覽

在vue2中,v-for的優先權高於v-if;在vue3中,v-if的優先權高於v-for。在vue中,永遠不要把v-if和v-for同時用在同一個元素上,會帶來效能方面的浪費(每次渲染都會先循環再進行條件判斷);想要避免這種情況,可在外層嵌套template(頁面渲染不產生dom節點),在這一層進行v-if判斷,然後在內部進行v-for迴圈。

vue中v-if和v-for哪個優先權高

本教學操作環境:windows7系統、vue3版,DELL G3電腦。

v-if指令用於條件性地渲染一塊內容。指令用於條件性地渲染一塊內容。這塊內容只會在指令的表達式回傳 true值的時候被渲染。
v-for指令是基於一個陣列來渲染一個清單。 v-for指令需要使用item in items形式的特殊語法,其中items是來源資料數組或對象,而item則是被迭代的陣列元素的別名。

v-for的時候,建議設定key值,並且保證每一個key值都是獨一無二的,這便是diff演算法進行最佳化。

<modal></modal>

  •     {{ item.label }}
  • 優先權

    其實在vue2和vue3的答案是完全相反的。

    • 在vue2中,v-for的優先權高於v-if

    • 在vue3中,v-if的優先權高於v-for

    vue中v-if和v-for哪個優先權高

    vue2中的v-for和v-if

    v-ifv-for都是vue範本系統中的指令。

    vue模板編譯的時候,會將指令系統轉換為可執行的render函數。

    寫一個p標籤,同時使用v-ifv-for

    <div>
        <p>
            {{ item.title }}
        </p>
    </div>

    建立vue 範例,存放isShowitems資料。

    const app = new Vue({
      el: "#app",
      data() {
        return {
          items: [
            { title: "foo" },
            { title: "baz" }]
        }
      },
      computed: {
        isShow() {
          return this.items && this.items.length > 0
        }
      }
    })
    ƒ anonymous() {
      with (this) { return 
        _c('div', { attrs: { "id": "app" } }, 
        _l((items), function (item) 
        { return (isShow) ? _c('p', [_v("\n" + _s(item.title) + "\n")]) : _e() }), 0) }
    }

    _lvue的列表渲染函數,函數內部都會進行一次if判斷。
    初步得到結論:v-for優先權是比v-if高。
    再將v-forv-if放在不同標籤

    <div>
        <template>
            <p>{{item.title}}</p>
        </template>
    </div>

    再輸出下render函數

    ƒ anonymous() {
      with(this){return 
        _c('div',{attrs:{"id":"app"}},
        [(isShow)?[_v("\n"),
        _l((items),function(item){return _c('p',[_v(_s(item.title))])})]:_e()],2)}
    }

    這時候我們可以看到,v-forv-if作用在不同標籤時候,是先進行判斷,再進行列表的渲染。

    export function genElement (el: ASTElement, state: CodegenState): string {
      if (el.parent) {
        el.pre = el.pre || el.parent.pre
      }
      if (el.staticRoot && !el.staticProcessed) {
        return genStatic(el, state)
      } else if (el.once && !el.onceProcessed) {
        return genOnce(el, state)
      } else if (el.for && !el.forProcessed) {
        return genFor(el, state)
      } else if (el.if && !el.ifProcessed) {
        return genIf(el, state)
      } else if (el.tag === 'template' && !el.slotTarget && !state.pre) {
        return genChildren(el, state) || 'void 0'
      } else if (el.tag === 'slot') {
        return genSlot(el, state)
      } else {
        // component or element
        ...
    }

    在進行if判斷的時候,v-for是比v-if先判斷。

    最終v-for優先比v-if高。

    vue3中的v-for和v-if

    在vue3中,v-if的優先權高於v-fo,所以v-if執行時,它所呼叫的變數還不存在,就會導致異常

    說明:通常有兩種情況下導致我們這樣做:

    1.為了過濾列表中的項目,例如:

    v-for="user in users" v-if="user.isActive"
    • 在vue2中,把它們放在一起,輸出的渲染函數中可以看出會先執行循環再判斷條件,哪怕我們只渲染列表中一小部分元素,也得在每次重渲染的時候遍歷整個列表,這會比較浪費
    • 在vue3中,v-if的優先權高於v-fo,所以v-if執行時,它調用的變數還不存在,就會導致異常

    此時定義一個計算屬性(例如activeUsers),讓其傳回過濾後的清單即可(例如 users.filter(u=>u.isActive))。

    2.為了避免渲染本來應該被隱藏的列表

    v-for="user in users" v-if="shouldShowUsers"
    • 同樣,在vue2中,把它們放在一起,輸出的渲染函數中可以看出會先執行循環再判斷條件,即使我們只渲染列表中一小部分元素,也得在每次重渲染的時候遍歷整個列表,這會比較浪費
    • 在vue3中,這樣寫雖然並不會報錯,但是官方還是及其不推薦外面這樣去做

    此時把v-if移到容器元素上(比如ulol)或外麵包層一層template即可。

    注意事項

    永遠不要把v-if 和v-for 同時用在同一個元素上,帶來效能上的浪費(每次渲染都會先循環再進行條件判斷)

    • 如果避免出現這種情況,則在外層嵌套template(頁面渲染不生成dom節點),在這一層進行v-if判斷,然後在內部進行v-for循環

    <template v-if="isShow">
        <p v-for="item in items">
    </template>
    • 如果條件出現在循環內部,可透過計算屬性computed提前過濾掉那些不需要顯示的項目

    computed: {
        items: function() {
          return this.list.filter(function (item) {
            return item.isShow
          })
        }
    }

    【相关视频教程推荐:vuejs入门教程web前端入门

    以上是vue中v-if和v-for哪個優先權高的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn