v-if和v-for哪個(gè)優(yōu)先級(jí)更高慌随?如果兩個(gè)同時(shí)出現(xiàn),應(yīng)該怎樣優(yōu)化得到更好的性能

先給出答案肯定是v-for的優(yōu)先級(jí)別高躺同,原因是從兩個(gè)方面說(shuō)明

原因

1阁猜、實(shí)踐出真知,自己寫例子

<template>
  <div id="app">
    //兩者同級(jí)
    <div>
      <p  v-for="(item, index) in list" :key="index" v-if="isShow">
        {{item.isFolder?item.name:''}}
      </p>
    </div>
    <p>渲染函數(shù):{{$options.render}}</p>
  </div>
</template>

<script>
export default {
  name: 'App',
  data () {
    return {
      list: [{
        id: 0,
        name: "app",
        isFolder: true
      },
      {
        id: 1,
        name: "app1",
        isFolder: false
      }]
    }
  },
  computed: {
    isShow () {
      return this.list && this.list.length > 0
    }
  }
}
</script>

兩者同級(jí)渲染函數(shù)如下蹋艺,先執(zhí)行的列表渲染_l函數(shù)剃袍,每個(gè)條件里面再去判斷_vm.isShow,性能不好

function() { 
  var _vm = this 
  var _h = _vm.$createElement 
  var _c = _vm._self._c || _h return _c("div", { attrs: { id: "app" } }, [ _c( "div", _vm._l(_vm.list, function(item, index) { 
  return _vm.isShow ? _c("p", { key: index },
   [ _vm._v( "\n " + _vm._s(item.isFolder ? item.name : "") + "\n " ) ]) : _vm._e() }), 0 ), _vm._v(" "), 
  _c("p", [_vm._v(_vm._s(_vm.$options.render))]) ]) 
}
<template>
  <div id="app">
    //兩者不同級(jí)
    <div  v-if="isShow">
      <p  v-for="(item, index) in list" :key="index">
        {{item.isFolder?item.name:''}}
      </p>
    </div>
    <p>渲染函數(shù):{{$options.render}}</p>
  </div>
</template>

<script>
export default {
  name: 'App',
  data () {
    return {
      list: [{
        id: 0,
        name: "app",
        isFolder: true
      },
      {
        id: 1,
        name: "app1",
        isFolder: false
      }]
    }
  },
  computed: {
    isShow () {
      return this.list && this.list.length > 0
    }
  }
}
</script>

兩者不同級(jí)渲染函數(shù)如下捎谨,_vm.isShow 先判斷條件民效,條件不通過(guò)直接返回空函數(shù)_vm._e(),不再去執(zhí)行渲染列表

function() { 
 var _vm = this 
 var _h = _vm.$createElement 
 var _c = _vm._self._c || _h return _c("div", { attrs: { id: "app" } }, [ _vm.isShow ? _c( "div", _vm._l(_vm.list, function(item, index) { 
return _c("p", { key: index }, [ _vm._v( "\n " + _vm._s(item.isFolder ? item.name : "") + "\n " ) ]) }), 0 ) : _vm._e(), _vm._v(" "), _c("p", [_vm._v(_vm._s(_vm.$options.render))]) ]) }

2涛救、vue源碼畏邢,src/compiler/codegen/index.js 64行代碼

很明顯,先判斷的for检吆,在判斷的if

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) {
   /*先進(jìn)入for語(yǔ)句*/
    return genFor(el, state)
  } else if (el.if && !el.ifProcessed) {
  /*再進(jìn)入if語(yǔ)句*/
    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)
  }

結(jié)論

  1. 顯然v-for優(yōu)先于v-if被解析舒萎,原因可以從以上兩點(diǎn)出發(fā)解釋
  2. 如果同時(shí)出現(xiàn),每次渲染都會(huì)先執(zhí)行循環(huán)再判斷條件蹭沛,無(wú)論如何循環(huán)都不可避免臂寝,浪費(fèi)了性能
  3. 要避免出現(xiàn)這種情況章鲤,則在外層嵌套template,在這一層進(jìn)行v-if判斷咆贬,然后在內(nèi)部進(jìn)行v-for循環(huán)
  4. 優(yōu)化:如果條件出現(xiàn)在循環(huán)內(nèi)部败徊,可通過(guò)計(jì)算屬性提前過(guò)濾掉那些不需要顯示的項(xiàng)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市素征,隨后出現(xiàn)的幾起案子集嵌,更是在濱河造成了極大的恐慌萝挤,老刑警劉巖御毅,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怜珍,居然都是意外死亡端蛆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門酥泛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)今豆,“玉大人,你說(shuō)我怎么就攤上這事柔袁〈舳悖” “怎么了遏匆?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵西饵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鸠项,道長(zhǎng)腥例,這世上最難降的妖魔是什么辅甥? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮燎竖,結(jié)果婚禮上璃弄,老公的妹妹穿的比我還像新娘。我一直安慰自己构回,他們只是感情好夏块,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著纤掸,像睡著了一般拨扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茁肠,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天患民,我揣著相機(jī)與錄音,去河邊找鬼垦梆。 笑死匹颤,一個(gè)胖子當(dāng)著我的面吹牛仅孩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播印蓖,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辽慕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赦肃?” 一聲冷哼從身側(cè)響起溅蛉,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎他宛,沒(méi)想到半個(gè)月后船侧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厅各,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年镜撩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队塘。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袁梗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出憔古,到底是詐尸還是另有隱情遮怜,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布鸿市,位于F島的核電站锯梁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灸芳。R本人自食惡果不足惜涝桅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烙样。 院中可真熱鬧冯遂,春花似錦、人聲如沸谒获。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)批狱。三九已至裸准,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赔硫,已是汗流浹背炒俱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人权悟。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓砸王,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親峦阁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谦铃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容