摘要:簡(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)單,方便,快捷。
actionaction是個(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]); // ? falseimmutable
但是復(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
摘要:但是和一起使用還需要一個(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一起使用...
摘要:面試題來源于網(wǎng)絡(luò),看一下高級(jí)前端的面試題,可以知道自己和高級(jí)前端的差距。 面試題來源于網(wǎng)絡(luò),看一下高級(jí)前端的面試題,可以知道自己和高級(jí)前端的差距。有些面試題會(huì)重復(fù)。 使用過的koa2中間件 koa-body原理 介紹自己寫過的中間件 有沒有涉及到Cluster 介紹pm2 master掛了的話pm2怎么處理 如何和MySQL進(jìn)行通信 React聲明周期及自己的理解 如何...
摘要:面試的公司分別是阿里網(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)出來。 面試的公司分...
閱讀 597·2023-04-26 01:42
閱讀 3231·2021-11-22 11:56
閱讀 2408·2021-10-08 10:04
閱讀 857·2021-09-24 10:37
閱讀 3138·2019-08-30 15:52
閱讀 1759·2019-08-29 13:44
閱讀 480·2019-08-28 17:51
閱讀 2151·2019-08-26 18:26