想用Vuejs突破20K必備的熱門面試題(一)v-if

村長的話

同學們好,我是Young村長。關(guān)于Vue框架部分會涉及一些高頻面試題,大多數(shù)看似非常初級,在官方文檔就能查看的純記憶性質(zhì)的面試題,比如:

  • vue組件之間如何通信?
  • vue生命周期有哪些?

這類面試題在文檔中就能找到答案,網(wǎng)絡(luò)上面找到的答案也是千篇一律。大家只要使用過vue并且稍加記憶即可流暢作答,但如果你也這樣回答,就算自己真的比其他競爭者更有實力,也很難脫穎而出,更別提獲得高薪offer了。

事實真是這樣嗎?

答案當然是否定的。以下本系列提煉于全棧課程的訓練營,我們的問題并不多,但是旨在將回答問題的方式、思路和層次提升一個層級。如果你真的學會了這些方法,在絕大多數(shù)情況下都會有舉一反三的效果,可以說拿下offer如探囊取物一般簡單!

下面開會

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

源碼中找答案compiler/codegen/index.js

<p v-for="item in items" v-if="condition">

做個測試如下

<!DOCTYPE html>
<html>

<head>
    <title>Vue事件處理</title>
</head>

<body>
    <div id="demo">
        <h1>v-for和v-if誰的優(yōu)先級高?應(yīng)該如何正確使用避免性能問題?</h1>
        <!-- <p v-for="child in children" v-if="isFolder">{{child.title}}</p> -->
        <template v-if="isFolder">
            <p v-for="child in children">{{child.title}}</p>
        </template>
    </div>
    <script src="../../dist/vue.js"></script>
    <script>
        // 創(chuàng)建實例
        const app = new Vue({
            el: '#demo',
            data() {
                return {
                    children: [
                        {title:'foo'},
                        {title:'bar'},
                    ]
                }
            },
            computed: {
                isFolder() {
                    return this.children && this.children.length > 0 
                }
            },
        });
        console.log(app.$options.render);
    </script>
</body>
</html>

兩者同級時,渲染函數(shù)如下:

(function anonymous(
) {
with(this){return _c('div',{attrs:{"id":"demo"}},[_c('h1',[_v("v-for和v-if誰的優(yōu)先級高?應(yīng)該如何正確使用避免性能問題?")]),_v(" "),
_l((children),function(child){return (isFolder)?_c('p',[_v(_s(child.title))]):_e()})],2)}
})

_l包含了isFolder的條件判斷

兩者不同級時,渲染函數(shù)如下

(function anonymous(
) {
with(this){return _c('div',{attrs:{"id":"demo"}},[_c('h1',[_v("v-for和v-if誰的優(yōu)先級高?應(yīng)該如何正確使用避免性能問題?")]),_v(" "),
(isFolder)?_l((children),function(child){return _c('p',[_v(_s(child.title))])}):_e()],2)}
})

先判斷了條件再看是否執(zhí)行_l

結(jié)論:

  1. 顯然v-for優(yōu)先于v-if被解析(把你是怎么知道的告訴面試官)
  2. 如果同時出現(xiàn),每次渲染都會先執(zhí)行循環(huán)再判斷條件,無論如何循環(huán)都不可避免,浪費了性能
  3. 要避免出現(xiàn)這種情況,則在外層嵌套template,在這一層進行v-if判斷,然后在內(nèi)部進行v-for循環(huán)
  4. 如果條件出現(xiàn)在循環(huán)內(nèi)部,可通過計算屬性提前過濾掉那些不需要顯示的項

下篇文章我們將繼續(xù)來講解"data的限制",關(guān)注小編不迷路,持續(xù)為你輸送前端爆文~

動動小手點個贊,與小編一起勇闖前端圈兒,歡迎留言評論,一起討論喲~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容