目錄
二、兩者的優先權" >二、兩者的優先權
三、注意事項" >三、注意事項
首頁 web前端 前端問答 vue中v-if和v-for的差別是什麼

vue中v-if和v-for的差別是什麼

Dec 27, 2022 pm 06:48 PM
vue3 v-if v-for

v-if和v-for的差別:1、作用不同,v-if指令用於條件性地渲染一塊內容,這塊內容只會在指令的表達式回傳true值的時候被渲染;而v-for指令是基於一個陣列來渲染一個清單。 2.優先權不同,v-for優先權比v-if高,在進行if判斷的時候v-for是比v-if先進行判斷的。

vue中v-if和v-for的差別是什麼

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

首先在官方文件中明確指出v-for和v-if不建議一起使用。

一、v-if和v-for的作用

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

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

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

兩者在用法上區別如下:

<div v-if="isShow" >123</div>
  
<li v-for="item in items" :key="item.id">
  {{ item.label }}
</li>
登入後複製

二、兩者的優先權

在使用中,v-for優先權比v-if高

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

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

範例
寫一個p標籤,同時使用v-if與v-for

<div id="app">
  <p v-if="isShow" v-for="item in items">
    {{ item.title }}
  </p>
</div>
登入後複製

建立vue實例,存放isShow與items資料

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(&#39;div&#39;, { attrs: { "id": "app" } }, 
  _l((items), function (item) { return (isShow) ? _c(&#39;p&#39;, [_v("\n" + _s(item.title) + "\n")]) : _e() }), 0) }
}
登入後複製

_l是vue的列表渲染函數,函數內部都會進行一次if判斷
初步得到結論:v-for優先權是比v-if高

然後再將v-for與v-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(&#39;div&#39;,{attrs:{"id":"app"}},
  [(isShow)?[_v("\n"),
  _l((items),function(item){return _c(&#39;p&#39;,[_v(_s(item.title))])})]:_e()],2)}
}
登入後複製

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

我們再在查看下vue原始碼
原始碼位置:\vue-dev\src\compiler\codegen\index.js

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 === &#39;template&#39; && !el.slotTarget && !state.pre) {
  return genChildren(el, state) || &#39;void 0&#39;
 } else if (el.tag === &#39;slot&#39;) {
  return genSlot(el, state)
 } else {
  // component or element
  ...
}
登入後複製

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

最終判斷結果是v-for的優先權高於v-if的

三、注意事項

#永遠不要把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
   })
  }
}
登入後複製

案例說明:

#原因:v-for比v-if優先權高,每次都需要遍歷整個數組,造成不必要的計算,影響性能.

例如,使用v-for在頁面中循環100個li標籤,但是只顯示index=97的那個li標籤內容,其餘的全部隱藏。
即使100個list中只需要使用一個數據,它也會循環整個陣列。

 <ul>
    <li v-for="item in list" v-if="item.actived">{{item.name}}</li>
 </ul>
登入後複製

解決:使用computed

<ul>
    <li v-for="item in activeList">{{item.name}}</li>
</ul>

computed: {
  activeList() {
    return this.list.filter(val => {
      return val.actived;
    });
  }
},
登入後複製

【相關推薦: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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Vue3如何實作刷新頁面局部內容 Vue3如何實作刷新頁面局部內容 May 26, 2023 pm 05:31 PM

想要實現頁面的局部刷新,我們只需要實現局部元件(dom)的重新渲染。在Vue中,想要實現這效果最簡單的方式方法就是使用v-if指令。在Vue2中我們除了使用v-if指令讓局部dom的重新渲染,也可以新建一個空白元件,需要刷新局部頁面時跳轉至這個空白元件頁面,然後在空白元件內的beforeRouteEnter守衛中又跳轉回原來的頁面。如下圖所示,如何在Vue3.X中實現點擊刷新按鈕實現紅框範圍內的dom重新加載,並展示對應的加載狀態。由於Vue3.X中scriptsetup語法中組件內守衛只有o

怎麼使用vue3+ts+axios+pinia實現無感刷新 怎麼使用vue3+ts+axios+pinia實現無感刷新 May 25, 2023 pm 03:37 PM

vue3+ts+axios+pinia實作無感刷新1.先在專案中下載aiXos和pinianpmipinia--savenpminstallaxios--save2.封裝axios請求-----下載js-cookienpmiJS-cookie-s//引入aixosimporttype{AxiosRequestConfigig ,AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

Vue3中怎麼實現選取頭像並裁剪 Vue3中怎麼實現選取頭像並裁剪 May 29, 2023 am 10:22 AM

最終效果安裝VueCropper組件yarnaddvue-cropper@next上面的安裝值針對Vue3的,如果時Vue2或想使用其他的方式引用,請訪問它的npm官方地址:官方教程。在元件中引用使用時也很簡單,只需要引入對應的元件和它的樣式文件,我這裡沒有在全域引用,只在我的元件檔案中引入import{userInfoByRequest}from'../js/api' import{VueCropper}from'vue-cropper&

Vue3中的v-for函數詳解:完美解決列表資料渲染 Vue3中的v-for函數詳解:完美解決列表資料渲染 Jun 18, 2023 am 09:57 AM

隨著數位技術的不斷進步,前端開發已經成為一個越來越受歡迎的職業。而Vue3由於其簡單易用、高效穩定的特性,成為了越來越多開發者的首選。其中,v-for函數是Vue3中用於列表資料渲染的核心函數之一。在這篇文章中,我們將對Vue3中的v-for函數進行詳解,讓你能夠更好地運用它來解決實際開發中的問題。一、基礎語法v-for函數的基礎語法如下:&lt;divv-

Vue3中如何使用defineCustomElement定義元件 Vue3中如何使用defineCustomElement定義元件 May 28, 2023 am 11:29 AM

使用Vue建構自訂元素WebComponents是一組web原生API的統稱,允許開發者建立可重複使用的自訂元素(customelements)。自訂元素的主要好處是,它們可以在使用任何框架,甚至在不使用框架的場景下使用。當你面向的最終用戶可能使用了不同的前端技術棧,或者當你希望將最終的應用與它使用的組件實現細節解耦時,它們會是理想的選擇。 Vue和WebComponents是互補的技術,Vue為使用和創建自訂元素提供了出色的支援。你可以將自訂元素整合到現有的Vue應用中,或使用Vue來構

Vue報錯:無法正確使用v-if指令進行條件渲染,如何解決? Vue報錯:無法正確使用v-if指令進行條件渲染,如何解決? Aug 19, 2023 pm 01:09 PM

Vue報錯:無法正確使用v-if指令進行條件渲染,如何解決?在Vue開發中,經常會使用v-if指令來根據條件來渲染頁面中的特定內容。然而,有時我們可能會遇到一個問題,當我們正確使用v-if指令時,卻無法得到期望的結果,並且會收到報錯訊息。本文將介紹這個問題的解決方法,並提供一些範例程式碼來幫助理解。一、問題描述通常,我們在Vue模板中透過v-if指令來判斷是否

Vue中使用v-for的最佳實務及效能最佳化方法 Vue中使用v-for的最佳實務及效能最佳化方法 Jul 17, 2023 am 08:53 AM

Vue中使用v-for的最佳實務及效能最佳化方法引言:在Vue開發中,使用v-for指令是非常常見的,它可以方便地將陣列或物件的資料遍歷渲染到範本上。然而,在處理大規模資料時,不當地使用v-for可能會導致效能問題。本文將介紹在使用v-for指令時的最佳實踐,並提供一些效能最佳化方法。最佳實務:使用唯一的Key值Vue中使用v-for指令渲染每一項資料時,需要為

vue3中的createApp怎麼使用 vue3中的createApp怎麼使用 May 22, 2023 pm 11:40 PM

函數定義createApp函數定義在檔案packages/runtime-dom/src/index.ts中exportconstcreateApp=((...args)=>{constapp=ensureRenderer().createApp(...args)if(__DEV__){injectNativeTagCheck (app)injectCompilerOptionsCheck(app)}const{mount}=appapp.mount=(containerOrSelector

See all articles