亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Redux性能優(yōu)化

plokmju88 / 1509人閱讀

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

Redux is a predictable state container for JavaScript apps.

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

store

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

store在創(chuàng)建的時(shí)候內(nèi)部會(huì)執(zhí)行dispatch({ type: ActionTypes.INIT }),用來(lái)初始化整個(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è)問(wèn)題,如果reducer比較多的時(shí)候,性能是不是就會(huì)出問(wèn)題。大家可能會(huì)想到減少reducer,這也是一個(gè)辦法,但是如果刻意減少reducer的話(huà),可能會(huì)導(dǎo)致某個(gè)reducer內(nèi)過(guò)于復(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
  }
}

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

action

action是個(gè)object,它必須有個(gè)type屬性,一般是個(gè)常量,來(lái)標(biāo)示action類(lèi)型,方便reducer處理。除去type剩下的一般就是要處理的數(shù)據(jù),如果數(shù)據(jù)比較簡(jiǎn)單可以直接使用Object.assign({}, state, action.data)來(lái)處理,這種方法僅適合簡(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來(lái)解決這個(gè)問(wèn)題。immutable不可改變的意思,在Object-C中是原生提供這種數(shù)據(jù)類(lèi)型的。對(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通過(guò)結(jié)構(gòu)共享來(lái)解決的數(shù)據(jù)拷貝時(shí)的性能問(wèn)題,數(shù)據(jù)被set的時(shí)候,immutable.js會(huì)只clone它的父級(jí)別以上的部分,其他保持不變,這樣大家可以共享同樣的部分,可以大大提高性能。如圖

subscribe

每次執(zhí)行dispatch,通過(guò)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,而沒(méi)有處理好執(zhí)行dispatch條件的話(huà),很容易造成dispatch->listener->dispatch死循環(huán)。所以建議通過(guò)middleware的方式來(lái)處理,而且在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://www.ezyhdfw.cn/yun/91627.html

相關(guān)文章

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

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

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

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

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

    摘要:面試的公司分別是阿里網(wǎng)易滴滴今日頭條有贊挖財(cái)滬江餓了么攜程喜馬拉雅兌吧微醫(yī)寺庫(kù)寶寶樹(shù)海康威視蘑菇街酷家樂(lè)百分點(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月開(kāi)始準(zhǔn)備面試,過(guò)五關(guān)斬六將,最終抱得網(wǎng)易歸,深深感受到高級(jí)前端面試的套路。以下是自己整理的面試題匯總,不敢藏私,統(tǒng)統(tǒng)貢獻(xiàn)出來(lái)。 面試的公司分...

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

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

0條評(píng)論

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