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

資訊專欄INFORMATION COLUMN

Redux性能優(yōu)化

plokmju88 / 1459人閱讀

摘要:簡(jiǎn)單的說就是能夠管理的狀態(tài),狀態(tài)是由數(shù)據(jù)維護(hù)的,也就是說是管理數(shù)據(jù)的。在內(nèi),每執(zhí)行一次,所有的都會(huì)執(zhí)行。所以這里就有個(gè)問題,如果比較多的時(shí)候,性能是不是就會(huì)出問題。

Redux is a predictable state container for JavaScript apps.

簡(jiǎn)單的說就是Redux能夠管理js app的狀態(tài),狀態(tài)是由數(shù)據(jù)維護(hù)的,也就是說Redux是管理數(shù)據(jù)的。那么Redux是怎么管理數(shù)據(jù)的呢?

store

一個(gè)Redux app中只有一個(gè)store,所有的數(shù)據(jù)都在這個(gè)store中,而通過createStore(reducer, [initState]),initState是可選參數(shù),也就是說決定store的是reducer,reducer決定store中存放什么樣的數(shù)據(jù)、處理什么樣的數(shù)據(jù)、處理數(shù)據(jù)的方式。

store在創(chuàng)建的時(shí)候內(nèi)部會(huì)執(zhí)行dispatch({ type: ActionTypes.INIT }),用來初始化整個(gè)store的數(shù)據(jù)結(jié)構(gòu),同時(shí)獲取reducer中的默認(rèn)數(shù)據(jù)。之所以能拿到全部的數(shù)據(jù)結(jié)構(gòu),是因?yàn)樵?b>dispatch({ type: ActionTypes.INIT })的時(shí)候,所有的reducer都會(huì)執(zhí)行,并根據(jù)reducer的combine結(jié)構(gòu)生成數(shù)據(jù)。在Redux內(nèi),每執(zhí)行一次dispatch,所有的reducer都會(huì)執(zhí)行。

reducer

所以這里就有個(gè)問題,如果reducer比較多的時(shí)候,性能是不是就會(huì)出問題。大家可能會(huì)想到減少reducer,這也是一個(gè)辦法,但是如果刻意減少reducer的話,可能會(huì)導(dǎo)致某個(gè)reducer內(nèi)過于復(fù)雜,后期難以維護(hù)。

const dispatcher = (state={}, action) {
  switch (action.type) {
    case "TYPE1": 
    case "TYPE2":
      return reducerFirst(state, action)
    case "TYPE3":
      return reducerSecond(state, action)
    default:
      return state
  }
}

通過這樣簡(jiǎn)單的過濾就可以實(shí)現(xiàn)只讓對(duì)action感興趣的reducer執(zhí)行,簡(jiǎn)單,方便,快捷。

action

action是個(gè)object,它必須有個(gè)type屬性,一般是個(gè)常量,來標(biāo)示action類型,方便reducer處理。除去type剩下的一般就是要處理的數(shù)據(jù),如果數(shù)據(jù)比較簡(jiǎn)單可以直接使用Object.assign({}, state, action.data)來處理,這種方法僅適合簡(jiǎn)單數(shù)據(jù)。

如果是復(fù)雜數(shù)據(jù),有較深的層級(jí),就要使用深度拷貝,這時(shí)候你可以使用lodash的cloneDeep進(jìn)行深度拷貝。

var objects = [{ "a": 1 }, { "b": 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// ? false
immutable

但是復(fù)雜數(shù)據(jù)的深度拷貝是很花性能的,這個(gè)時(shí)候就可以使用immutable.js來解決這個(gè)問題。immutable不可改變的意思,在Object-C中是原生提供這種數(shù)據(jù)類型的。對(duì)immutable.js生成的數(shù)據(jù)進(jìn)行操作之后總是返回一個(gè)新的數(shù)據(jù),原有的數(shù)據(jù)不會(huì)改變。

var Immutable = require("immutable");
var map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set("b", 50);
map1.get("b"); // 2
map2.get("b"); // 50

immutable.js通過結(jié)構(gòu)共享來解決的數(shù)據(jù)拷貝時(shí)的性能問題,數(shù)據(jù)被set的時(shí)候,immutable.js會(huì)只clone它的父級(jí)別以上的部分,其他保持不變,這樣大家可以共享同樣的部分,可以大大提高性能。如圖

subscribe

每次執(zhí)行dispatch,通過subscribe注冊(cè)的listener都會(huì)被執(zhí)行,如果listener較多,或者listener內(nèi)部處理比較復(fù)雜也會(huì)對(duì)性能產(chǎn)生影響, 而且在listener內(nèi)部很難區(qū)分哪個(gè)數(shù)據(jù)被改變了,如果在listener內(nèi)部繼續(xù)dispatch,而沒有處理好執(zhí)行dispatch條件的話,很容易造成dispatch->listener->dispatch死循環(huán)。所以建議通過middleware的方式來處理,而且在middleware內(nèi)部可以知道action是什么,就可以只處理關(guān)心的action。

總結(jié)

預(yù)分配reducer、精簡(jiǎn)reducer

精簡(jiǎn)action數(shù)據(jù)或使用immutable.js

使用middleware處理特殊需求(reducer中不方便處理的需求)

參考

Redux

immutable.js

cloneDeep

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

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

相關(guān)文章

  • React-Redux性能優(yōu)化

    摘要:但是和一起使用還需要一個(gè)工具,這一篇就說一下在使用上的一些性能優(yōu)化建議。如果的改變會(huì)引起值變化,那么會(huì)調(diào)用轉(zhuǎn)換函數(shù),傳入作為參數(shù),并返回結(jié)果。如果的值和前一次的一樣,它將會(huì)直接返回前一次計(jì)算的數(shù)據(jù),而不會(huì)再調(diào)用一次轉(zhuǎn)換函數(shù)。 前面寫了兩篇文章《React組件性能優(yōu)化》《Redux性能優(yōu)化》,分別針對(duì)React和Redux在使用上的性能優(yōu)化給了一些建議。但是React和Redux一起使用...

    JouyPub 評(píng)論0 收藏0
  • 高級(jí)前端面試題大匯總(只有試題,沒有答案)

    摘要:面試題來源于網(wǎng)絡(luò),看一下高級(jí)前端的面試題,可以知道自己和高級(jí)前端的差距。 面試題來源于網(wǎng)絡(luò),看一下高級(jí)前端的面試題,可以知道自己和高級(jí)前端的差距。有些面試題會(huì)重復(fù)。 使用過的koa2中間件 koa-body原理 介紹自己寫過的中間件 有沒有涉及到Cluster 介紹pm2 master掛了的話pm2怎么處理 如何和MySQL進(jìn)行通信 React聲明周期及自己的理解 如何...

    kviccn 評(píng)論0 收藏0
  • 2018大廠高級(jí)前端面試題匯總

    摘要:面試的公司分別是阿里網(wǎng)易滴滴今日頭條有贊挖財(cái)滬江餓了么攜程喜馬拉雅兌吧微醫(yī)寺庫寶寶樹??低暷⒐浇挚峒覙钒俜贮c(diǎn)和海風(fēng)教育。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本人于7-8月開始準(zhǔn)備面試,過五關(guān)斬六將,最終抱得網(wǎng)易歸,深深感受到高級(jí)前端面試的套路。以下是自己整理的面試題匯總,不敢藏私,統(tǒng)統(tǒng)貢獻(xiàn)出來。 面試的公司分...

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

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

0條評(píng)論

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