成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

iView之Select組件的優(yōu)化

jsbintask / 671人閱讀

摘要:接下來(lái)本文會(huì)對(duì)比組件在性能上做出的優(yōu)化。出現(xiàn)該問(wèn)題的原因在組件的鉤子中有三個(gè)監(jiān)聽(tīng),分別是組件添加,刪除,和選中時(shí)監(jiān)聽(tīng)事件。在監(jiān)聽(tīng)事件中會(huì)去遍歷當(dāng)中的所有子組件做出相應(yīng)的改變。

iViewSelect組件在性能上的優(yōu)化

????我們公司的組件庫(kù)是基于iView 比較早的版本修改后的僅供公司內(nèi)部使用的組件庫(kù),因此在使用的過(guò)程中就會(huì)遇到一些問(wèn)題。接下來(lái)本文會(huì)對(duì)比Select組件在性能上做出的優(yōu)化。

Debounce函數(shù)

????我們先來(lái)回顧一下debounce函數(shù)的使用場(chǎng)景:在前端頁(yè)面我們會(huì)遇到一些頻繁觸發(fā)的事件;比如

鼠標(biāo)的移動(dòng)mousemove事件;

window對(duì)象的resize、scroll事件;

keydown,keyup事件;

實(shí)際的使用過(guò)程中我們可能不需要每次觸發(fā)事件的時(shí)候都去響應(yīng)該事件,我們往往需要當(dāng)用戶(hù)停止操作多少ms后去響應(yīng)事件。這個(gè)時(shí)候我們就需要用到debounce函數(shù)了。下面是一段debounce函數(shù)

export function debounce(fn) {
    let waiting;
    return function() {
        if (waiting) return;
        waiting = true;
        const context = this,
            args = arguments;
        const later = function() {
            waiting = false;
            fn.apply(context, args);
        };
        this.$nextTick(later);
    };
}

這段代碼的意思的意思是當(dāng)DOM更新后去響應(yīng)這個(gè)事件,并且DOM更新后只會(huì)執(zhí)行一次
有了這些知識(shí)的準(zhǔn)備我們就可以來(lái)談?wù)勈褂眠@個(gè)組件遇到的性能問(wèn)題了。

低版本iviewSelect組件遇到的問(wèn)題

????在使用低版本的組件過(guò)程中,當(dāng)數(shù)據(jù)量很大例如某個(gè)select選擇器里面有500條甚至更多的數(shù)據(jù)時(shí),進(jìn)行模糊搜索有可能卡死頁(yè)面,關(guān)閉頁(yè)面有延遲。

出現(xiàn)該問(wèn)題的原因

????在Select組件的mounted鉤子中有三個(gè)監(jiān)聽(tīng),分別是組件添加,刪除,和選中時(shí)監(jiān)聽(tīng)事件。在監(jiān)聽(tīng)事件中會(huì)去遍歷Select當(dāng)中的所有子組件做出相應(yīng)的改變。

//監(jiān)聽(tīng)子組件的移除
this.$on("remove",() => {
    if (!this.remote) {
        this.modelToQuery();
        this.$nextTick(() => this.broadcastQuery(""));
    } else {
        this.findChild((child) => {
            child.updateSearchLabel();   // #1865
            child.selected = this.multiple ? this.model.indexOf(child.value) > -1 : this.model === child.value;
        });
    }
    this.slotChange();
    this.updateOptions(true);
})

查找這個(gè)監(jiān)聽(tīng)的通知對(duì)象發(fā)現(xiàn)正是Select的子組件在銷(xiāo)毀或者是創(chuàng)建時(shí)通知父組件做出相應(yīng)的變化。

//組件銷(xiāo)毀時(shí)通知父組件
beforeDestroy () {
    this.dispatch("iSelect", "remove");
    this.$off("on-select-close", this.onSelectClose);
    this.$off("on-query-change",this.onQueryChange);
}

那么問(wèn)題就出在這里了,當(dāng)有大量的子組件時(shí),每一個(gè)組件移除,父組件需要遍歷一次。這樣就拖累性能。

解決辦法

????既然前面提到debounce函數(shù),想必大家應(yīng)該想到要怎么解決了。使用debounce函數(shù)能夠解決這個(gè)問(wèn)題,我們只需要所有子組件銷(xiāo)毀時(shí)通知父組件一次就夠了。引入debounce函數(shù)后經(jīng)本人測(cè)試基本上解決了卡頓以及卡死的問(wèn)題,代碼如下。

//select組件mounted函數(shù)當(dāng)中去監(jiān)聽(tīng) append 、remove 事件
this.$on("append", this.debouncedAppendRemove());
this.$on("remove", this.debouncedAppendRemove());
//引入debounce函數(shù)
debouncedAppendRemove(){
    return debounce(function(){
        if (!this.remote) {
            this.modelToQuery();
            this.$nextTick(() => this.broadcastQuery(""));
        } else {
            this.findChild((child) => {
                child.updateSearchLabel();   // #1865
                child.selected = this.multiple ? this.model.indexOf(child.value) > -1 : this.model === child.value;
            });
        }
        this.slotChange();
        this.updateOptions(true);
    });
}
其他細(xì)節(jié)

????低版本中子組件的監(jiān)聽(tīng)事件沒(méi)有移除掉,高版本的有移除。

mounted () {
    this.$on("on-select-close", this.onSelectClose);
    this.$on("on-query-change",this.onQueryChange);
}

beforeDestroy () {
    this.$off("on-select-close", this.onSelectClose);
    this.$off("on-query-change",this.onQueryChange);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94586.html

相關(guān)文章

  • VUE UI框架對(duì)比 element-ui 與 iView

    摘要:而則是用到到指令結(jié)合的方式去生成,批量生成元素。表格操作列自定義渲染的時(shí),使用的是的函數(shù),直接在中插入對(duì)應(yīng)模板表格分頁(yè)都需要引入分頁(yè)組件配合使用兩者總體比較,要比簡(jiǎn)潔許多。 element VS iview(最近項(xiàng)目UI框架在選型 ,做了個(gè)分析, 不帶有任何利益相關(guān))主要從以下幾個(gè)方面來(lái)做對(duì)比使用率(npm 平均下載頻率,組件數(shù)量,star, issue…)API風(fēng)格打包優(yōu)化與設(shè)計(jì)師友...

    ZHAO_ 評(píng)論0 收藏0
  • Vue高效UI組件庫(kù)—iView開(kāi)發(fā)實(shí)踐

    摘要:它的文檔也是相當(dāng)詳細(xì),每個(gè)功能都配有詳細(xì)說(shuō)明和實(shí)例代碼,直接復(fù)制就可以使用,我們也計(jì)劃在明年啟動(dòng)英文文檔翻譯計(jì)劃。明年會(huì)啟動(dòng)英文文檔翻譯計(jì)劃,也希望喜歡和支持,同時(shí)英語(yǔ)不錯(cuò)的同學(xué)可以加入我們,一起參與翻譯。 前段時(shí)間在微軟參加活動(dòng),分享了 TalkingData 開(kāi)源的基于 Vue.js 的高效 UI 組件庫(kù) iView 的一些開(kāi)發(fā)經(jīng)驗(yàn),現(xiàn)整理成文,和大家探討。 showImg(htt...

    wean 評(píng)論0 收藏0
  • iView 近期更新,以及那些“不為人知”故事

    摘要:如圖所示還有其它很多項(xiàng)的更新,比如新增屬性,可以設(shè)置面板展開(kāi)時(shí)默認(rèn)顯示的日期。目前最新版本支持鍵盤(pán)可訪問(wèn)性的組件有。期待你的加入下個(gè)版本預(yù)告下個(gè)版本計(jì)劃重構(gòu)組件,以全面支持表單組件的鍵盤(pán)可訪問(wèn)性,敬請(qǐng)期待。 在過(guò)去的兩個(gè)多月里,iView 陸續(xù)發(fā)布了 2.9.0 和 2.10.0 兩個(gè)重要版本。這兩個(gè)版本總共有 255 個(gè) commit,超過(guò) 40 項(xiàng)更新。來(lái)看一下,iView 具體都...

    UsherChen 評(píng)論0 收藏0
  • iView 發(fā)布 3.0 版本,以及開(kāi)發(fā)者社區(qū)等 5 款新產(chǎn)品

    摘要:相對(duì)時(shí)間組件錨點(diǎn)組件面板分割組件分割線組件單元格組件相對(duì)時(shí)間組件用于表示幾分鐘前幾小時(shí)前等相對(duì)于此時(shí)此刻的時(shí)間描述。單元格組件在手機(jī)上比較常見(jiàn),在上則常用于固定的側(cè)邊菜單項(xiàng)。開(kāi)發(fā)者社區(qū)這是發(fā)布會(huì)最勁爆的一款產(chǎn)品了。 showImg(https://segmentfault.com/img/bVbeuj6?w=2864&h=1458); 7 月 28 日,我們成功地召開(kāi)了 iView 3...

    FreeZinG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<