欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          vue中v-if和v-for哪個(gè)優(yōu)先級(jí)高

          在vue2中,v-for的優(yōu)先級(jí)高于v-if;在vue3中,v-if的優(yōu)先級(jí)高于v-for。在vue中,永遠(yuǎn)不要把v-if和v-for同時(shí)用在同一個(gè)元素上,會(huì)帶來(lái)性能方面的浪費(fèi)(每次渲染都會(huì)先循環(huán)再進(jìn)行條件判斷);想要避免出現(xiàn)這種情況,可在外層嵌套template(頁(yè)面渲染不生成dom節(jié)點(diǎn)),在這一層進(jìn)行v-if判斷,然后在內(nèi)部進(jìn)行v-for循環(huán)。

          vue中v-if和v-for哪個(gè)優(yōu)先級(jí)高

          本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

          v-if指令用于條件性地渲染一塊內(nèi)容。指令用于條件性地渲染一塊內(nèi)容。這塊內(nèi)容只會(huì)在指令的表達(dá)式返回 true值的時(shí)候被渲染。
          v-for指令基于一個(gè)數(shù)組來(lái)渲染一個(gè)列表。v-for指令需要使用item in items形式的特殊語(yǔ)法,其中items是源數(shù)據(jù)數(shù)組或者對(duì)象,而item則是被迭代的數(shù)組元素的別名。

          v-for的時(shí)候,建議設(shè)置key值,并且保證每一個(gè)key值都是獨(dú)一無(wú)二的,這便是diff算法進(jìn)行優(yōu)化。

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

          優(yōu)先級(jí)

          其實(shí)在vue2和vue3中的答案是截然相反的。

          • 在vue2中,v-for的優(yōu)先級(jí)高于v-if

          • 在vue3中,v-if的優(yōu)先級(jí)高于v-for

          vue中v-if和v-for哪個(gè)優(yōu)先級(jí)高

          vue2中的v-for和v-if

          v-ifv-for都是vue模板系統(tǒng)中的指令。

          vue模板編譯的時(shí)候,會(huì)將指令系統(tǒng)轉(zhuǎn)化為可執(zhí)行的render函數(shù)。

          編寫(xiě)一個(gè)p標(biāo)簽,同時(shí)使用v-ifv-for

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

          創(chuàng)建vue示例,存放isShowitems數(shù)據(jù)。

          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的列表渲染函數(shù),函數(shù)內(nèi)部都會(huì)進(jìn)行一次if判斷。
          初步得到結(jié)論:v-for優(yōu)先級(jí)是比v-if高。
          再將v-forv-if置于不同標(biāo)簽

          <div id="app">     <template v-if="isShow">         <p v-for="item in items">{{item.title}}</p>     </template> </div>

          再輸出下render函數(shù)

          ? 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)} }

          這時(shí)候我們可以看到,v-forv-if作用在不同標(biāo)簽時(shí)候,是先進(jìn)行判斷,再進(jìn)行列表的渲染。

          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     ... }

          在進(jìn)行if判斷的時(shí)候,v-for是比v-if先進(jìn)行判斷。

          最終v-for優(yōu)先級(jí)比v-if高。

          vue3中的v-for和v-if

          在vue3中,v-if的優(yōu)先級(jí)高于v-fo,所以v-if執(zhí)行時(shí),它調(diào)用的變量還不存在,就會(huì)導(dǎo)致異常

          說(shuō)明:通常有兩種情況下導(dǎo)致我們這樣做:

          1.為了過(guò)濾列表中的項(xiàng)目,比如:

          v-for="user in users" v-if="user.isActive"
          • 在vue2中,把它們放在一起,輸出的渲染函數(shù)中可以看出會(huì)先執(zhí)行循環(huán)再判斷條件,哪怕我們只渲染列表中一小部分元素,也得在每次重渲染的時(shí)候遍歷整個(gè)列表,這會(huì)比較浪費(fèi)
          • 在vue3中,v-if的優(yōu)先級(jí)高于v-fo,所以v-if執(zhí)行時(shí),它調(diào)用的變量還不存在,就會(huì)導(dǎo)致異常

          此時(shí)定義一個(gè)計(jì)算屬性(比如 activeUsers),讓其返回過(guò)濾后的列表即可(比如users.filter(u=>u.isActive))。

          2.為了避免渲染本應(yīng)該被隱藏的列表

          v-for="user in users" v-if="shouldShowUsers"
          • 同樣,在vue2中,把它們放在一起,輸出的渲染函數(shù)中可以看出會(huì)先執(zhí)行循環(huán)再判斷條件,哪怕我們只渲染列表中一小部分元素,也得在每次重渲染的時(shí)候遍歷整個(gè)列表,這會(huì)比較浪費(fèi)
          • 在vue3中,這樣寫(xiě)雖然并不會(huì)報(bào)錯(cuò),但是官方還是及其不推薦外面這樣去做

          此時(shí)把v-if移動(dòng)至容器元素上(比如ul、ol)或者外面包一層template即可。

          注意事項(xiàng)

          永遠(yuǎn)不要把 v-if 和 v-for 同時(shí)用在同一個(gè)元素上,帶來(lái)性能方面的浪費(fèi)(每次渲染都會(huì)先循環(huán)再進(jìn)行條件判斷)

          • 如果避免出現(xiàn)這種情況,則在外層嵌套template(頁(yè)面渲染不生成dom節(jié)點(diǎn)),在這一層進(jìn)行v-if判斷,然后在內(nèi)部進(jìn)行v-for循環(huán)

          <template v-if="isShow">     <p v-for="item in items"> </template>
          • 如果條件出現(xiàn)在循環(huán)內(nèi)部,可通過(guò)計(jì)算屬性computed提前過(guò)濾掉那些不需要顯示的項(xiàng)

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

          【相關(guān)視頻教程推薦:vuejs入門(mén)教程、web前端入門(mén)】

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)