摘要:但是強(qiáng)迫癥犯了,為了使得性能達(dá)到極致,再次進(jìn)行了深度的優(yōu)化。把移動(dòng)中心設(shè)置在物體的重力中心,最為舒適。你可以狠狠的點(diǎn)擊預(yù)覽地址到此,組件,無論從性能,還是手感上來說,都已經(jīng)相當(dāng)?shù)姆衔覀兊男枨罅恕?/p>
倉(cāng)庫(kù)地址:Dragact手感絲滑的拖拽布局組件
預(yù)覽地址:支持手機(jī)端噢~
上回我們說到,Dragact組件已經(jīng)進(jìn)行了一系列的性能優(yōu)化,然而面對(duì)大量數(shù)據(jù)的時(shí)候,依舊比較吃力,讓我們來看看,優(yōu)化之前的Dragact。
縱向堆疊著314個(gè)方塊,插入時(shí)明顯的卡頓,大約1秒的延遲
同樣縱向堆疊著314個(gè)方塊,插入時(shí)卡頓明顯減少很多,可以接受
在實(shí)際生產(chǎn)過程中,可能不會(huì)有那么多物塊,就拿我們項(xiàng)目的dashboard來說,整個(gè)屏幕最多只有10個(gè)方塊,就已經(jīng)是了不起了。
但是強(qiáng)迫癥犯了,為了使得性能達(dá)到極致,再次進(jìn)行了深度的優(yōu)化。
React優(yōu)化的策略有哪些呢?
策略一: shouldComponentUpdate()因?yàn)镽eact 的diff只是簡(jiǎn)單的深度優(yōu)先+刷新策略去diff html tag,所以數(shù)據(jù)的改變,React是不會(huì)知道的。
因此,開發(fā)者必須得自己去diff數(shù)據(jù),shouldComponentUpdate就是用來diff數(shù)據(jù)的一個(gè)特殊聲明周期函數(shù)。
具體的,請(qǐng)看我之前的回答和徐飛叔的回答:
方正:Vue為什么沒有shouldComponentUpdate的生命周期?
徐飛:Vue為什么沒有shouldComponentUpdate的生命周期?
策略二:用記憶功能函數(shù)去緩存大量計(jì)算結(jié)果有很多情況下,我們的遍歷是不可避免的。
React中最著名性能問題,就是selector問題,現(xiàn)在大家也都知道用reselect去做性能優(yōu)化了,但是本質(zhì)呢?
我們寫一點(diǎn)偽代碼來做演示:
//首先,我們有一個(gè)斐波那契生成函數(shù) fib(); //用戶想用的時(shí)候,就會(huì)去掉這個(gè)函數(shù) const number = fib(); //我們知道,fib()函數(shù)里面會(huì)經(jīng)過大量的計(jì)算,才得出我們想要的結(jié)果 //但是,除了第一次計(jì)算之外,之后的所有計(jì)算都是不需要的,因?yàn)槲覀円呀?jīng)在一開始拿到結(jié)果了 //怎么做最好呢?閉包; const Fib = function (){ var cache = void 666; return function(){ if(!cache){ cache = fib(); return cache; } return cache; } }();
//當(dāng)用戶調(diào)用Fib的時(shí)候,只會(huì)在第一次進(jìn)行計(jì)算,之后的后只會(huì)從cache中拿出來。
不要小看這種優(yōu)化,很多時(shí)候,我們大量重復(fù)的遍歷就會(huì)導(dǎo)致性能的低下。
策略三:減少dom的深度我們都知道,每次react 更新的時(shí)候,都會(huì)進(jìn)行diff,深度越大,diff的層次越多。
減少diff的層次是非常重要的性能優(yōu)化手段,尤其是數(shù)據(jù)量巨大的時(shí)候。
具體怎么去減少dom的深度,方法有很多,我用的方法是:render children的辦法。
簡(jiǎn)單的舉個(gè)例子,拖拽組件:
我是拖拽的組件
這樣的一個(gè)設(shè)計(jì),看似很簡(jiǎn)單,很明了。用Dragger組件去包囊我們想要的組件,就可以讓其獲得拖拽的屬性。
這么做不是不行,但是很多時(shí)候我們?cè)谠O(shè)計(jì)之初,沒考慮那么多,就會(huì)使用這樣一種方式去設(shè)計(jì):
class Dragger extends Component{ moving(){}...... render(){ return ({this.props.children}) } }
是不是很常見?這么做的問題其實(shí)很明顯,就是無緣無故的,我們多了一層div,組件一多,那么就多會(huì)了幾層div,無疑造成了渲染壓力。
使用render children,我們可以這么設(shè)計(jì)
class Dragger extends Component{ moving(){}...... render(){ const provided = { onMouseDown:this.onMouseDown onTouchDown:this.onTouchDown style:{....} } return this.props.children(provided); } }
在外部使用的時(shí)候,就變成了:
{(provided)=> 我是拖拽的組件}
看似稍微蛋疼了一些,但是好處就是:減少了dom的層級(jí)。
還有更多好處,可以看之前的一篇文章:React組件:拖拽布局Dragact v0.1.6 發(fā)布
手感的優(yōu)化看似很標(biāo)準(zhǔn),實(shí)際上用戶需要拖動(dòng)很遠(yuǎn),才會(huì)物體進(jìn)行交換
看似很標(biāo)準(zhǔn),實(shí)際上用戶需要拖動(dòng)很遠(yuǎn),才會(huì)物體進(jìn)行交換,造成這樣讓人不適的感覺原因是因?yàn)橛?jì)算時(shí),我取的計(jì)算中心永遠(yuǎn)是物體的頂邊。
所以,當(dāng)物體向下滑動(dòng)的時(shí)候,必須要物體的頂邊到達(dá)下一個(gè)物塊的中心才能發(fā)生交換。
上圖我們可以看到,長(zhǎng)條的物塊,已經(jīng)拖出了屏幕很遠(yuǎn),才會(huì)進(jìn)行交換。
就這一點(diǎn)點(diǎn)差異,讓我頓時(shí)感到不爽!
為了使得手感更加優(yōu)異,做了大量實(shí)驗(yàn)以后,我發(fā)現(xiàn),把移動(dòng)中心設(shè)置在物體的重力中心,最為舒適。
把移動(dòng)中心設(shè)置在物體的重力中心,最為舒適。
這一點(diǎn)點(diǎn)設(shè)計(jì)的改變,使得手感完全不同了。
你可以狠狠的點(diǎn)擊:預(yù)覽地址
到此,Dragact組件,無論從性能,還是手感上來說,都已經(jīng)相當(dāng)?shù)姆衔覀兊男枨罅恕?/p>
yeah~
各位,我們下次見。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93025.html
摘要:但是強(qiáng)迫癥犯了,為了使得性能達(dá)到極致,再次進(jìn)行了深度的優(yōu)化。把移動(dòng)中心設(shè)置在物體的重力中心,最為舒適。你可以狠狠的點(diǎn)擊預(yù)覽地址到此,組件,無論從性能,還是手感上來說,都已經(jīng)相當(dāng)?shù)姆衔覀兊男枨罅恕? 倉(cāng)庫(kù)地址:Dragact手感絲滑的拖拽布局組件 預(yù)覽地址:支持手機(jī)端噢~ 上回我們說到,Dragact組件已經(jīng)進(jìn)行了一系列的性能優(yōu)化,然而面對(duì)大量數(shù)據(jù)的時(shí)候,依舊比較吃力,讓我們來看看,優(yōu)化...
摘要:新特性性能提升通過對(duì)組件渲染的優(yōu)化以及內(nèi)部算法的優(yōu)化,把大量的遍歷和渲染都省掉。新特性不一樣的掛件渲染依賴注入式的掛件可以從最簡(jiǎn)單的例子看出,我們渲染子組件的方式和以往有些不同。通過獲取組件的實(shí)例,我提供了一個(gè),用于獲取當(dāng)前的布局信息。 showImg(https://segmentfault.com/img/remote/1460000013377768?w=600&h=375); ...
摘要:新特性性能提升通過對(duì)組件渲染的優(yōu)化以及內(nèi)部算法的優(yōu)化,把大量的遍歷和渲染都省掉。新特性不一樣的掛件渲染依賴注入式的掛件可以從最簡(jiǎn)單的例子看出,我們渲染子組件的方式和以往有些不同。通過獲取組件的實(shí)例,我提供了一個(gè),用于獲取當(dāng)前的布局信息。 showImg(https://segmentfault.com/img/remote/1460000013377768?w=600&h=375); ...
摘要:造輪子的一些思考首先,我們的需求是用戶能夠方便的調(diào)整后臺(tái)的各種表盤位置。內(nèi)的所有組件必須不能重疊,還要能自動(dòng)排序某些組件要可以設(shè)定靜態(tài)的,也就是固定在那里,不被布局的任何變動(dòng)而影響。為了快速獲得這種心態(tài)的轉(zhuǎn)變,你要做的就是造輪子。 先來一張圖看看: showImg(https://segmentfault.com/img/remote/1460000013305417?w=600&h=...
閱讀 1301·2021-11-24 09:39
閱讀 2679·2021-09-30 09:47
閱讀 1335·2021-09-22 15:15
閱讀 2424·2021-09-10 10:51
閱讀 1973·2019-08-30 15:55
閱讀 2984·2019-08-30 11:06
閱讀 905·2019-08-30 10:53
閱讀 845·2019-08-29 17:26