請你說一下Vue中v-if和v-for的優先級誰更高

  • v-if 與 v-for簡介
    • v-if
    • v-for
    • v-if & v-for使用
  • v-if 與 v-for優先級比較
    • vue2 中,v-for的優先級高于v-if
      • 例子進行分析
    • vue3 v-if 具有比 v-for 更高的優先級
      • 例子進行分析
  • 總結
    • 在vue2中,v-for的優先級高于v-if
    • 在vue3中,v-if的優先級高于v-for

咋一聽到這個題,如果自己沒有試驗過感覺還真容易說錯,就像是會進入一個“思維誤區”

就會理所當然的想如果這兩個指令同時出現一個標簽那是不是應該先if判斷是否存在才會去渲染for的循環結構?

但實際是這樣嗎?

v-if 與 v-for簡介

v-if

v-if 指令用于條件性地渲染一塊內容。這塊內容只會在指令的表達式返回 true值的時候被渲染。

v-if是Vue.js中的一個指令,用于條件渲染,根據綁定的表達式的值的真假情況來決定是否顯示或隱藏元素。

當v-if的表達式值為true時,元素會被渲染出來;當v-if的表達式值為false時,元素不會被渲染出來。

例如,下面代碼中,如果isShow為true,則div元素將會被渲染,否則不會被渲染:

<template><div v-if="isShow">show content</div>
</template>

需要注意的是,v-if指令會根據表達式的值動態地添加或刪除元素,因此如果有頻繁的切換操作,會影響性能。

此時可以考慮使用v-show指令,它只是簡單地控制元素的顯示或隱藏,并沒有頻繁的添加或刪除元素。

v-for

v-for 指令基于一個數組來渲染一個列表。v-for 指令需要使用 item in items 形式的特殊語法,其中 items 是源數據數組或者對象,而 item 則是被迭代的數組元素的別名。

v-for使用 的時候,建議設置key值,并且保證每個key值是獨一無二的,這便于diff算法進行優化。

v-for是Vue.js中的一個指令,用于循環渲染數組或對象的數據。

v-for的用法有兩種情況:

  1. 遍歷數組:
    可以通過v-for指令循環渲染一個數組,將數組中的每個元素渲染成對應的元素或組件。語法形式為:v-for="item in array"

例如,下面代碼中使用v-for指令循環渲染一個數組list中的每個元素:

<template><div><ul><li v-for="item in list" :key="item.id">{{ item.name }}</li></ul></div>
</template><script>
export default {data() {return {list: [{ id: 1, name: 'Apple' },{ id: 2, name: 'Banana' },{ id: 3, name: 'Orange' }]};}
}
</script>
  1. 遍歷對象:
    可以通過v-for指令循環渲染一個對象的屬性,將對象的屬性和值渲染成對應的元素或組件。語法形式為:v-for="value, key in object"

例如,下面代碼中使用v-for指令循環渲染一個對象info的每個屬性:

<template><div><ul><li v-for="(value, key) in info" :key="key">{{ key }}: {{ value }}</li></ul></div>
</template><script>
export default {data() {return {info: {name: 'John',age: 25,gender: 'Male'}};}
}
</script>

需要注意的是,在使用v-for時,需要為每個循環的元素或組件添加唯一的key屬性,以便Vue.js能夠跟蹤每個節點的身份,并且在更新時進行高效的DOM操作。

更多詳細內容,請微信搜索“前端愛好者戳我 查看

v-if & v-for使用

<ul> <li v-for='user in users' :key='user.id'>{{user.name}}</li>
</ul> 
<footer v-if='user'>{{user}}</footer>

v-if 與 v-for優先級比較

  • 在vue2中,v-for的優先級高于v-if
  • 在vue3中,v-if的優先級高于v-for(Vue 3.0 已經調整了v-if和v-for 的優先級,故不存在渲染性能問題。)

vue2 中,v-for的優先級高于v-if

當 v-if 與 v-for 一起使用時,v-for 具有比 v-if 更高的優先級。

官方文檔:https://v2.cn.vuejs.org/v2/guide/conditional.html#v-if-%E4%B8%8E-v-for-%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8

在 Vue 2 中,不推薦在同一個元素上同時使用 v-if 和 v-for,主要是由于可能引發的性能問題和邏輯混淆。當 v-if 和 v-for 結合使用時,會導致以下問題:

  1. 性能問題: 當 v-if 和 v-for 同時存在于同一個元素上時,Vue 會在每次循環迭代時都重新渲染和銷毀元素。這可能會導致不必要的 DOM 更新和性能下降,特別是在較長的列表上。這是因為每次循環迭代都會重新計算條件,并進行 DOM 操作。

  2. 邏輯混淆: 同時使用 v-if 和 v-for 會增加代碼的復雜性和理解難度。將條件和循環邏輯分離可以使代碼更加清晰,并讓開發人員更容易理解和維護。

例子進行分析
<template><div class="test-container"><div v-for="(item,index) in list" v-if="item === 9" :key="item" ></div></div>
</template>
<script>export default {data(){return {numberArr:[1,2,3,4,5,6,7,8,9,10]}}};
</script>
<style scoped>
</style>

但是本段代碼實際的邏輯為

this.numberArr.map(function (item,index) {if (item===9) {return item}
})

相反,最佳實踐是:

將條件渲染 (v-if) 和列表渲染 (v-for) 分開處理。
可以使用計算屬性或方法來處理數據,然后在模板中分別使用 v-if 和 v-for。

以下是一個示例代碼:

<template><div><div v-if="showDiv" v-for="item in filteredItems" :key="item.id">{{ item.name }}</div></div>
</template><script>
export default {data() {return {showDiv: true,items: [{ id: 1, name: 'Item 1', isActive: true },{ id: 2, name: 'Item 2', isActive: false },{ id: 3, name: 'Item 3', isActive: true }]}},computed: {filteredItems() {return this.items.filter(item => item.isActive);}}
}
</script> 

在上述示例中,我們使用了計算屬性 filteredItems 來過濾具有 isActive 屬性的項目。

然后,我們在模板中使用 v-for 來渲染過濾后的結果,并使用 v-if 來條件性地渲染每個元素。這樣可以保持邏輯的清晰和性能的優化。

vue3 v-if 具有比 v-for 更高的優先級

當 v-if 與 v-for 一起使用時,v-if 具有比 v-for 更高的優先級。

官方文檔:https://cn.vuejs.org/guide/essentials/list.html#v-for-with-v-if

<!--這會拋出一個錯誤,因為屬性 todo 此時沒有在該實例上定義
-->
<li v-for="todo in todos" v-if="!todo.isComplete">{{ todo.name }}
</li>

推薦: 在外新包裝一層 再在其上使用 v-for 可以解決這個問題 (這也更加明顯易讀):

<template v-for="todo in todos"><li v-if="!todo.isComplete">{{ todo.name }}</li>
</template>
例子進行分析
<template><div class="test-container"><div v-for="(item,index) in numberArr" v-if="item === 9" :key="item"></div></div>
</template>
<script>
export default {data(){return {numberArr: [1,2,3,4,5,6,7,8,9,10]   //需要遍歷的數據}}
};
</script>
<style scoped>
</style> 

由于 v-if 優先級高,導致頁面并沒有進行渲染,控制臺報錯。

以下為控制臺報錯信息

[Vue warn]: Property "index" was accessed during render but is not defined on instance.

但是下面這種用法控制臺并不會報錯但是會警告

<template><div class="test-container"><ul><li v-for="(item, index) in objList" :key="index" v-if="item.isShow">{{ item.name }}</li></ul></div>
</template>
<script>export default {data(){return {objList:[{ name: 'obj2', isShow: false },{ name: 'obj2', isShow: true },]}}};
</script>
<style scoped>
</style> 

但是這種寫法也會有一個問題,無論是否符合v-if的條件都進行了報錯

官方推薦的寫法是這樣的, 把 v-for 移動到容器元素上,例如ul,ol 或者外面包裹一層 template

<template><div class="test-container"><ul><template v-for="(item, index) in objList" :key="index"><li v-if="item.isShow">{{ item.name }}</li></template></ul></div>
</template>
<script>export default {data(){return {objList:[{ name: 'obj2', isShow: false },{ name: 'obj2', isShow: true },]}}};
</script>
<style scoped>
</style>

但如果想要有條件地跳過循環的執行,那么可以將v-if置于外層元素或者template上。

例如這樣:

<template><div class="test-container"><ul v-if="objList.length"><li v-for="(item, index) in objList" :key="index">{{ item.name }}</li></ul></div>
</template>
<script>
export default {data(){return {objList:[{ name: 'obj2', isShow: false },{ name: 'obj2', isShow: true },]}}
};
</script>
<style scoped>
</style>

總結

在vue2中,v-for的優先級高于v-if

Vue 會在每次循環迭代時都重新渲染和銷毀元素。

v-for比v-if優先級更高(可以說清結論的來源更好)。

如果同時出現在同一個標簽上,則每次渲染都會先執行循環再進行條件判斷,會造成較大的性能浪費。

解決辦法有兩種:

  • 先在外層套一個template來放置v-if,再嵌套v-for。
  • 借助computed計算屬性代替v-if。

在vue3中,v-if的優先級高于v-for

注:Vue 3.0 已經調整了v-if和v-for 的優先級,故不存在渲染性能問題。

參考文檔

  • https://www.nowcoder.com/discuss/513503986318696448
  • https://baijiahao.baidu.com/s?id=1766197354040903874&wfr=spider&for=pc

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164977.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RubyMine 2023:提升Rails/Ruby開發效率的強大利器

在Rails/Ruby開發領域&#xff0c;JetBrains RubyMine一直以其強大的功能和優秀的性能而備受開發者的青睞。現如今&#xff0c;我們迎來了全新的RubyMine 2023版本&#xff0c;它將為開發者們帶來更高效的開發體驗和無可比擬的工具支持。 首先&#xff0c;RubyMine 2023提供了…

Java-使用poi-tl根據word模板動態生成word

作者wangsz&#xff0c;想寫一些關于word的工具&#xff0c;所以就寫了這篇文章 1.首先&#xff0c;先導入所需要的依賴&#xff08;poi相關依賴即可&#xff09; <!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi&l…

【libGDX】使用Mesh繪制立方體

1 前言 本文主要介紹使用 Mesh 繪制立方體&#xff0c;讀者如果對 Mesh 不太熟悉&#xff0c;請回顧以下內容&#xff1a; 使用Mesh繪制三角形使用Mesh繪制矩形使用Mesh繪制圓形 在繪制立方體的過程中&#xff0c;主要用到了 MVP &#xff08;Model View Projection&#xff0…

目標檢測YOLO系列從入門到精通技術詳解100篇-【目標檢測】計算機視覺(最終篇)

目錄 知識儲備 KITTI數據集 1.KITTI數據集概述 2.數據采集平臺 3.Dataset詳述 算法原理

GIT無效的源路徑/URL

ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa

windows11上enable WSL

Windows電腦上要配置linux&#xff08;這里指ubuntu&#xff09;開發環境&#xff0c;主要有三種方式&#xff1a; 1&#xff09;在windows上裝個虛擬機&#xff08;比如vmware&#xff09;。缺點是vmware加載ubuntu后系統會變慢很多&#xff0c;而且需要通過samba來實現window…

git clone -mirror 和 git clone 的區別

目錄 前言兩則區別git clone --mirrorgit clone 獲取到的文件有什么不同瘦身倉庫如何選擇結語開源項目 前言 Git是一款強大的版本控制系統&#xff0c;通過Git可以方便地管理代碼的版本和協作開發。在使用Git時&#xff0c;常見的操作之一就是通過git clone命令將遠程倉庫克隆…

【vue2】axios請求與axios攔截器的使用詳解

&#x1f973;博 主&#xff1a;初映CY的前說(前端領域) &#x1f31e;個人信條&#xff1a;想要變成得到&#xff0c;中間還有做到&#xff01; &#x1f918;本文核心&#xff1a;當我們在路由跳轉前與后我們可實現觸發的操作 【前言】ajax是一種在javaScript代碼中發請…

低代碼開發與IT開發的區別

目錄 一、含義不同 二、開發門檻不同 三、兩者之間的區別 1、從技術特征來看 2、從目標開發者來看 四、低代碼平臺使用感受&#xff1f; &#xff08;1&#xff09;自定義模塊&#xff0c;滿足不同的業務需求 &#xff08;2&#xff09;工作流引擎&#xff0c;簡化復雜流程的管…

機器學習實戰-第4章 基于概率論的分類方法: 樸素貝葉斯

樸素貝葉斯 概述 貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。本章首先介紹貝葉斯分類算法的基礎——貝葉斯定理。最后,我們通過實例來討論貝葉斯分類的中最簡單的一種: 樸素貝葉斯分類。 貝葉斯理論 & 條件概率 貝葉斯理論 …

linux網絡之網絡層與數據鏈路層

文章目錄 一、網絡層 1.IP協議 2.IP協議頭格式 3.網段劃分 4.特殊ip地址 5.IP地址的數量限制 6.私有ip和公網IP 7.路由 二、數據鏈路層 1.以太網 2.以太網幀格式 3.MAC地址 4.對比理解MAC地址和IP地址 5.MTU 6.ARP協議 ARP協議的工作流程 ARP數據報的格式 7.DNS 8.ICMP協議 9.N…

839 - Not so Mobile (UVA)

題目鏈接如下&#xff1a; Online Judge 這道題劉汝佳的解法極其簡潔&#xff0c;用了20來行就解決了問題。膜拜…… 他的解法如下&#xff1a;天平&#xff08;UVa839紫書p157&#xff09;_天平 uva 839_falldeep的博客-CSDN博客 我寫了兩個&#xff08;都很冗長&#xff…

淺談電氣設備的絕緣在線監測與狀態維修探究

賈麗麗 安科瑞電氣股份有限公司 上海嘉定 201801 摘要&#xff1a;在線監測是控制好電氣設備絕緣的重要方式&#xff0c;為電力系統穩定奠定重要基礎。在線監測電氣設備時&#xff0c;要利用檢測技術促進電力系統運行效率提升&#xff0c;讓電氣設備在具體工作過程中發揮更大作…

升級jdk17過程中,原來的jdk8下的webservice客戶端怎樣處理

背景&#xff1a;之前jdk8環境下&#xff0c;使用的cxf框架&#xff0c;而且是動態加載解析作為客戶端。大家一直相處的很愉快。但是最近升級jdk17&#xff0c;發現cxf不好用了。網上百度&#xff0c;大部分都是說升級cxf版本&#xff0c;并且添加jaxb的相關依賴就可以了。但是…

在線接口測試工具fastmock使用

1、fastmock線上數據模擬器 在平時的項目測試中&#xff0c;尤其是前后端分離的時候&#xff0c;前端人員需要測試調用后端的接口&#xff0c;這個時候會出現測試不方便的情況。此時我們可以使用fastmock平臺在線上模擬出一個可以調用的接口&#xff0c;方便前端人員進行數據測…

C/C++---------------LeetCode第2540. 最小公共值

最小公共值 題目及要求哈希算法雙指針 題目及要求 給你兩個整數數組 nums1 和 nums2 &#xff0c;它們已經按非降序排序&#xff0c;請你返回兩個數組的 最小公共整數 。如果兩個數組 nums1 和 nums2 沒有公共整數&#xff0c;請你返回 -1 。 如果一個整數在兩個數組中都 至少…

categraf托管與自升級

categraf支持多種方式進行部署、托管&#xff0c;社區里部署和管理categraf也是五花八門&#xff0c;大家自己使用方便即可。 之前我們覺得大家通過ansible之類的工具批量下發/更新就能很簡單地完成任務&#xff0c;最近很多用戶咨詢我們關于categraf有沒有更方便的升級方式&am…

flink和機器學習模型的常用組合方式

背景 flink是一個低延遲高吞吐的系統&#xff0c;每秒處理的數據量高達數百萬&#xff0c;而機器模型一般比較笨重&#xff0c;雖然功能強大&#xff0c;但是qps一般都比較低&#xff0c;日常工作中&#xff0c;我們一般是如何把flink和機器學習模型組合起來一起使用呢? fli…

數據結構與算法【B樹】的Java實現+圖解

目錄 B樹 特性 實現 節點準備 大體框架 實現分裂 實現新增 實現刪除 完整代碼 B樹 也是一種自平衡的樹形數據結構&#xff0c;主要用于管理磁盤上的數據管理&#xff08;減少磁盤IO次數&#xff09;。而之前說的AVL樹與紅黑樹適合用于內存數據管理。存儲一個100w的數…

python每日一題——2字母異位詞分組

題目 給你一個字符串數組&#xff0c;請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。 示例 1: 輸入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 輸出: [[“bat”],[“nat”…