vue中v-if與v-for的優先級?

?🌈個人主頁:前端青山
🔥系列專欄:Vue篇
🔖人終將被年少不可得之物困其一生

依舊青山,本期給大家帶來vue篇專欄內容:vue中v-if與v-for的優先級?

目錄

v-if和v-for的優先級是什么?

一、作用

二、優先級

示例

注意事項

v-if 與 v-for 同時存在于一個元素上,會發生什么?

vue3中

vue2中

當我們在使用Vue.js開發應用程序時,經常會遇到需要根據條件顯示或隱藏元素的情況。Vue.js提供了v-ifv-for指令來實現這一功能。然而,當這兩個指令同時存在于同一個元素上時,我們需要了解它們的優先級,以便正確地控制元素的顯示與隱藏。

在Vue.js中,v-for指令用于循環渲染元素列表,而v-if指令用于條件性地渲染元素。當這兩個指令同時存在于一個元素上時,Vue.js將按照一定的優先級來解析它們。

v-if和v-for的優先級是什么?

一、作用

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

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

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

兩者在用法上

<Modal v-if="isShow" />
?
<li v-for="item in items" :key="item.id">{{ item.label }}
</li>

二、優先級

v-ifv-for都是vue模板系統中的指令

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

示例

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

<div id="app"><p v-if="isShow" v-for="item in items">{{ 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}}
})

模板指令的代碼都會生成在render函數中,通過app.$options.render就能得到渲染函數

? 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 id="app"><template v-if="isShow"><p v-for="item in items">{{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作用在不同標簽時候,是先進行判斷,再進行列表的渲染

我們再在查看下vue源碼

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

注意事項
  1. 永遠不要把 v-ifv-for 同時用在同一個元素上,帶來性能方面的浪費(每次渲染都會先循環再進行條件判斷)

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

<template v-if="isShow"><p v-for="item in items">
</template>

? 3.如果條件出現在循環內部,可通過計算屬性computed提前過濾掉那些不需要顯示的項

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

v-if 與 v-for 同時存在于一個元素上,會發生什么?

vue3中

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>vue3 v-for v-if優先級</title>
</head>
<body><div id="app"><!-- 審查元素查看優先級:vue3中,v-if的優先級高于v-for --><ul><li v-if="flag" v-for="item in list" :key="item">{{ item }}</li></ul></div>
</body>
<script src="../lib/vue.global.js"></script>
<script>
Vue.createApp({data () {return {list: ['a', 'b', 'c', 'd'],flag: false}}}).mount('#app')
</script>
</html>

vue2中

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>vue2 v-for v-if優先級</title>
</head>
<body>
<div id="app"><!-- 審查元素查看優先級:vue2中,v-for的優先級高于v-if --><ul><li v-if="flag" v-for="item in list" :key="item">{{ item }}</li></ul></div>
</body>
<script src="../lib/vue.js"></script>
<script>
new Vue({data: {list: ['a', 'b', 'c', 'd'],flag: false}}).$mount('#app')
</script>
</html>

通過審查元素得知:

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

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

首先,Vue.js會先解析v-for指令,生成循環的虛擬DOM節點。然后,在每個循環節點上,Vue.js會再次解析v-if指令,根據條件判斷是否顯示該節點。換句話說,v-for的循環優先于v-if的條件判斷。

這意味著,當v-ifv-for同時存在于同一個元素上時,元素會先被循環渲染出來,然后在每次循環內部進行條件判斷,決定是否顯示該元素。

這種優先級的設計是為了避免不必要的循環計算,提高性能。如果v-if的條件判斷放在v-for循環之外,那么每次循環都會進行一次條件判斷,這可能會影響性能。

因此,在使用v-ifv-for時,我們應該根據實際需求,合理地安排它們的位置。如果我們希望根據條件來動態顯示或隱藏循環渲染的元素,應該將v-if放在v-for的內部;如果我們只是希望在滿足某個條件時才進行循環渲染,可以將v-if放在v-for的外部。

總結起來,v-for的優先級高于v-if,因此在同一個元素上使用這兩個指令時,應根據實際需求合理安排它們的位置,以確保程序的正確運行和更好的性能。

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

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

相關文章

移動機器人,開啟智能柔性制造新篇章

智能制造是當今工業發展的必然趨勢&#xff0c;而柔性制造則是智能制造的重要組成部分。在這個快速變革的時代&#xff0c;如何提高生產效率、降低成本、增強靈活性成為了制造業的關鍵挑戰。富唯智能移動機器人應運而生&#xff0c;為柔性制造注入了新的活力。 基于富唯智能AI-…

凸問題與非凸問題

凸函數&#xff1a;曲線上任意兩點連線上的點對應的函數值不大于該兩點對應的函數值得連線上的值&#xff0c;例如yx^2&#xff1b; 非凸函數&#xff1a;曲線上任意兩點連線上的點對應的函數值既有大于該兩點對應的函數值得連線上的值的部分也有小于的部分&#xff0c;例如&am…

Re51:讀論文 Language Models as Knowledge Bases?

諸神緘默不語-個人CSDN博文目錄 諸神緘默不語的論文閱讀筆記和分類 論文名稱&#xff1a;Language Models as Knowledge Bases? ArXiv網址&#xff1a;https://arxiv.org/abs/1909.01066 官方GitHub項目&#xff1a;https://github.com/facebookresearch/LAMA 本文是2019年…

軟件測試個人求職簡歷該怎么寫,模板在這里

1、個人資料 姓名&#xff1a;xxx性別&#xff1a;x 手機號碼&#xff1a;138888888xx郵箱&#xff1a;xxx 學歷&#xff1a;本科專業&#xff1a;電子商務 英語&#xff1a;四級當前工作&#xff1a;測試工程師 從業時間&#xff1a;4年期望薪資&#xff1a;面議 求職意向軟件…

FIB表與快速轉發表實驗

實驗名稱&#xff1a;FIB表與快速轉發表實驗 網絡拓撲圖&#xff1a; 實驗步驟&#xff1a; 1、配置接口的IP地址 R1&#xff1a; R2&#xff1a; 2、配置OSPF路由協議 在R1宣告網段 在R2宣告網段 3、查看鄰居狀態&#xff0c;一直處于2-way狀態&#xff0c;要等待30秒&…

SAP 權限設置維護

權限設置維護 su21 點擊創建自己的 對象類&#xff08;OBJECT CLASS &#xff09; Z... 在點擊創建授權對象 輸入對象名 z... 對象名文本 字段名&#xff1a;ACTVT 點擊允的許活 按鈕 里面增刪改查等權限.... 保存 .權限對象 保存后需要 pfcg 配置權限對象 分…

a標簽超鏈接 —— 實現點擊前中后變色

淺淺記錄下 <style type"text/css"> a:link {color: yellow; /*未訪問鏈接顏色*/ }a:visited {color: red; /*已訪問鏈接顏色*/ }a:hover {color: blue; /*鼠標移動到鏈接顏色*/text-decoration: underline; }a:active {color: orange; /*鼠標點擊時顏色*/ }a…

二叉樹:C++實現

引言&#xff1a; 二叉樹是一種常見的數據結構&#xff0c;它具有良好的適用性和靈活性&#xff0c;能夠應用于各種領域。在C中實現二叉樹可以通過使用模板類和結構體來實現。下面我們將介紹如何在C中實現二叉樹&#xff0c;并提供一些基本的操作方法。 技術實現&#xff1a; …

如何將音頻添加到視頻并替換視頻中的音軌

隨著視頻流媒體網站的流行和便攜式設備的發展&#xff0c;你可能越來越傾向于自己制作視頻并在互聯網上分享。有時&#xff0c;你可能還需要編輯視頻并為其添加背景音樂&#xff0c;因為音樂總是對視頻的感知起著神奇的作用。 那如何給視頻添加音頻呢&#xff1f;或者如何用新…

阿里云跨賬號建立局域網

最近有活動&#xff0c;和好友一并薅了下阿里云的羊毛。琢磨著兩臺機器組一個局域網&#xff0c;于是有了這個需求&#xff0c;把步驟記錄一下&#xff1a; 假設兩臺機器叫A和B&#xff0c;我們開始進行建立和組網 1. 建立ECS 把A機器公共環境裝好&#xff0c;然后使用《實例與…

深入解析Java 8中HashMap的底層原理

引言 HashMap是Java中常用的集合類&#xff0c;用于存儲鍵值對。其底層實現經過多次優化&#xff0c;包括哈希算法、數組擴容、鏈表轉紅黑樹等。本文將深入研究HashMap的底層原理&#xff0c;并詳細探討如何解決哈希碰撞的技術。 1. 哈希算法 HashMap的核心是哈希算法&#…

Day38:518.零錢兌換II、377. 組合總和 Ⅳ

文章目錄 518.零錢兌換II思路代碼實現 377. 組合總和 Ⅳ思路代碼實現 518.零錢兌換II 題目鏈接 思路 確定dp數組&#xff08;dp table&#xff09;以及下標的含義 dp[j]&#xff1a;組合元素和為j的組合方式確定遞推公式 題目不是選取最優解&#xff0c;而是求路徑總和&…

【運動規劃】191 自適應跟蹤kinodynamicrrt的路徑

分層法&#xff1a; two layer approach 自適應控制&#xff0c;跟隨軌跡。運動規劃&#xff1a;擴展自由空間&#xff08;基于速度約束縮小自由空間&#xff09;為控制部分留余量&#xff0c;確保安全。 控制設計&#xff1a; 考慮平移和旋轉&#xff0c;速度環控制&#xff…

銀河麒麟安裝Docker

# 配置阿里云 Centos8 鏡像源&#xff0c;需要額外的一些依賴&#xff0c;而這些依賴在麒麟官方的源里面是沒有的 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo# 配置阿里云 docker 鏡像源 sudo yum-config-manager --add-r…

【23真題】Top3!最高148分,數二英二!

今天分享的是23年西安交通大學815的信號與系統數字信號處理試題及解析。眾所周知&#xff0c;Top3一共有10所&#xff0c;其中就包括了西安交大&#xff01; 本套試卷難度分析&#xff1a;平均分為117-128分&#xff0c;最高分為148分&#xff01;22年西安交大909/815的真題我…

2022-4-11 南科大現代控制與最優估計

CLEAR_LAB B站視頻 矩陣的分塊矩陣操作 diagonal 對角陣 identity matrix 單位矩陣 矩陣克羅內克積

【LeetCode二叉樹進階題目】606. 根據二叉樹創建字符串,102. 二叉樹的層序遍歷,107. 二叉樹的層序遍歷 II

二叉樹進階題目 606. 根據二叉樹創建字符串解題思路及實現 102. 二叉樹的層序遍歷解題思路及實現 107. 二叉樹的層序遍歷 II解題思路及實現 606. 根據二叉樹創建字符串 描述 給你二叉樹的根節點 root &#xff0c;請你采用前序遍歷的方式&#xff0c;將二叉樹轉化為一個由括號…

Android、ESP32、ESP8266的mqtt通信

Android activity_main <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http:/…

Python dbm庫:利用鍵值對存儲數據

更多Python學習內容&#xff1a;ipengtao.com 大家好&#xff0c;我是濤哥&#xff0c;今天為大家分享 Python dbm庫&#xff1a;利用鍵值對存儲數據&#xff0c;文章6000字&#xff0c;閱讀大約20分鐘&#xff0c;大家enjoy~~ Python中的dbm模塊提供了一種輕量級的數據庫管理工…

【ARM 嵌入式 編譯系列 2.3 -- GCC 中指定 ARMv8-M 的 Thumb 指令集參數詳細介紹】

請閱讀【ARM GCC 編譯專欄導讀】 上篇文章:【ARM 嵌入式 編譯系列 2.2 – 如何在Makefile 中添加編譯時間 | 編譯作者| 編譯 git id】 下篇文章:【ARM 嵌入式 C 入門及漸進 3 – GCC attribute((weak)) 弱符號使用】 文章目錄 ARMv8-M 架構Thumb 指令集ARMv8-M 與 Thumb-mth…