首頁 web前端 前端問答 vue中v-if和v-for哪個優先權高

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

Jul 20, 2022 pm 06:02 PM
vue vue.js v-if v-for

在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

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    <🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系統,解釋
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1664
    14
    CakePHP 教程
    1423
    52
    Laravel 教程
    1321
    25
    PHP教程
    1269
    29
    C# 教程
    1249
    24
    vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

    Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

    vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

    可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

    vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

    Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

    React與Vue:Netflix使用哪個框架? React與Vue:Netflix使用哪個框架? Apr 14, 2025 am 12:19 AM

    NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

    vue的div怎麼跳轉 vue的div怎麼跳轉 Apr 08, 2025 am 09:18 AM

    Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。

    vue怎麼a標籤跳轉 vue怎麼a標籤跳轉 Apr 08, 2025 am 09:24 AM

    實現 Vue 中 a 標籤跳轉的方法包括:HTML 模板中使用 a 標籤指定 href 屬性。使用 Vue 路由的 router-link 組件。使用 JavaScript 的 this.$router.push() 方法。可通過 query 參數傳遞參數,並在 router 選項中配置路由以進行動態跳轉。

    反應,vue和Netflix前端的未來 反應,vue和Netflix前端的未來 Apr 12, 2025 am 12:12 AM

    Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

    vue怎麼實現組件跳轉 vue怎麼實現組件跳轉 Apr 08, 2025 am 09:21 AM

    Vue 中實現組件跳轉有以下方法:使用 router-link 和 &lt;router-view&gt; 組件進行超鏈接跳轉,指定 :to 屬性為目標路徑。直接使用 &lt;router-view&gt; 組件顯示當前路由渲染的組件。使用 router.push() 和 router.replace() 方法進行程序化導航,前者保存歷史記錄,後者替換當前路由不留記錄。

    See all articles