對項目中的redux部分的優(yōu)化

前言:

盡管redux存在對緩存數(shù)據(jù)的模塊化拆分,但隨著項目的整體業(yè)務(wù)邏輯的一步步壯大,需要管理的數(shù)據(jù)和狀態(tài)也逐步增加;

于是,繁復(fù)的switch代碼讓部分reducer顯得很復(fù)雜,給后期維護(hù)增加了工作量之余,也對開發(fā)階段造成了一定的影響。

需求:

針對上述情況,于是想著是否能做一些代碼結(jié)構(gòu)的調(diào)整,讓此部分代碼顯得清晰明了,減輕開發(fā)和維護(hù)階段的工作量?

參考思路:

在vue里運(yùn)用vuex之初,基本上是照著官方文檔敲得代碼,于是,盡管做了模塊化拆分,但大量相似的mutation還是讓頁面顯得很臃腫。

然后發(fā)現(xiàn)實際上大部分的mutation操作的邏輯是類似的,都是重新賦值操作;于是,對mutations部分的實現(xiàn)變成了如下所示:

const mutations = {}

Object.keys(state).forEach(prop => {

? const setProp = `set${prop.charAt(0).toUpperCase()}${prop.slice(1)}`

? mutations[setProp] = (state, payload) => {

? ? state[prop] = payload

? }

})

如上實現(xiàn)方式的好處有兩點:

1,純函數(shù):將mutation變成了安全的純函數(shù)的形式

2,邏輯單一:不用再去考慮在mutation里寫入其他不必要的邏輯(因為這些邏輯實際上可以在commit之前就完成)

嘗試實現(xiàn):

根據(jù)上述對vuex里mutation部分的實現(xiàn),也許我們可以將如下reducer的形式:

const initUser = {

? ? user_info: {}

}

export default (user=initUser,action) => {

? ? switch (action.type){

? ? ? ? case 'update_user_info':

? ? ? ? ? ? return Object.assign({}, user, {

? ? ? ? ? ? ? ? user_info: action.user_info,

? ? ? ? ? ? ? ? token:? action.token || 'zixiaochen'

? ? ? ? ? ? })

? ? ? ? ? ? break;

? ? ? ? case 'user_is_update':

? ? ? ? ? ? return Object.assign({}, user, {

? ? ? ? ? ? ? ? update_info: action.update_info

? ? ? ? ? ? })

? ? ? ? ? ? break;

? ? ? ? case 'clear_user':

? ? ? ? ? ? return user;

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? return user

? ? }

}

修改為:

const actions = {}

Object.keys(initUser).forEach(prop => {

? const setProp = `update_${prop}`

? actions[setProp] = (state, payload) => {

? ? return {

...state,payload

? ? }

})

export default (user=initUser,action) => {

actions[action.type](user,action.updateData);

}

實現(xiàn)思路為:

1,將redux里數(shù)據(jù)變更的部分拆分出來,作vue中mutation的處理;

2,用...擴(kuò)展符號,淺復(fù)制一個相同的數(shù)據(jù)對象,然后用新增數(shù)據(jù)部分payload對象去合并覆蓋該復(fù)制對象里的已有屬性的值

3,調(diào)用actions里的方法,傳入state對象和需要變更的數(shù)據(jù)對象(也就是payload對應(yīng)的實參)

參考文檔:

動手實現(xiàn) React-redux:

http://huziketang.mangojuice.top/books/react/lesson30

如何更優(yōu)雅地使用 Redux:

https://cloud.tencent.com/developer/article/1005855

vue官方文檔

hippus關(guān)于vuex的代碼優(yōu)化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 該文章僅作為個人筆記在使用redux的時候,避免不了的就是創(chuàng)建各種action和actionCreator等,有沒...
    Tim張閱讀 3,473評論 3 1
  • We're moving! react-router-redux is going to live alongsi...
    NOTEBOOK2閱讀 753評論 0 0
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類 // 創(chuàng)建一...
    蕓豆_6a86閱讀 437評論 0 0
  • 本文主要是以我的另一篇文章的思維過程來操作,希望大家使用后可以記住整個過程,從而活學(xué)活用,使用到自己的項目中. 參...
    nextChallenger閱讀 31,911評論 13 41
  • Redux簡介 Redux從設(shè)計之初就不是為了編寫最短、最快的代碼,他是為了解決 “當(dāng)有確定的狀態(tài)發(fā)生改變時,數(shù)據(jù)...
    _花閱讀 465評論 0 1

友情鏈接更多精彩內(nèi)容