React Redux與複雜業務元件的復用

2021-09-11 12:52:27 字數 3968 閱讀 2462

從redux的state中讀取使用者token。

由於這個元件需要讀取存放在redux state中的使用者token,並且包含非同步請求,將它的狀態放入redux中管理,並且使用redux-saga處理非同步請求是非常合適的。

但是在元件的復用性上,我們遇到乙個難題,由於redux本身並不提供模組化功能,我們想要復用使用了redux/redux-saga的元件時:

我們需要為這個元件註冊乙個全域性不衝突的reducerkey。

我們需要修改元件所關注的action型別,因為全域性會有多個元件例項,如果action型別重複,會引起錯誤的元件狀態改變。

元件被解除安裝後,reducer繼續存在,會輕微的損失一些執行效能。

針對這種情形,我們開發了redux-arena

redux-arena會將redux/redux-saga的**與react元件匯出成乙個react高階元件以供復用:

在高階元件被掛載(mount)時,會自動初始化redux-saga的任務,初始化元件的reducer並在redux維護的state上註冊自己的節點。

在高階元件被解除安裝(unmout)時,會自動取消redux-saga的任務,銷毀元件的reducer並從redux維護的state上刪除自己的節點。

提供元件通道機制,元件傳送的action預設只能被元件自己的reducer接收。也可以通過配置放棄通道,接收全域性的action。

提供vreducerkey機制,redux中如果元件間想共享state資訊,需要知道知道真實的節點名稱,在可復用的redux元件中很容易引發衝突,redux-arena提供vreducerkey機制保證了state節點真實名稱永遠不會衝突。vreducerkey在同名時,下層元件會覆蓋掉上層元件的vreducerkey資訊。

提供單向的(類似flux的 one-way data flow)元件狀態和actions的共享方案,下層元件可以通過vreducerkey獲取上層元件的state和actions。

與redux-saga深度整合,在redux-saga中也可以選擇只傳送和接收元件自己的action。

我們將每乙個匯出的redux/react繫結的高階元件稱為scene。首先我們要為scene構造actions和reducer,然後使用bundletocomponent,匯出高階元件。

import  from

"redux-arena/helper";

import * as actions from

"./actions";

import state from

"./actions";

import reducer from

"./reducer";

import componenta from

"./componenta";

export

default bundletocomponent();

複製**

現在我們匯出的這個元件,就可以和普通的元件一樣直接在react中使用了。

需要注意的是,redux-arena增強了redux的store,需要使用createarenastore建立store:

import react from

"react";

import reactdom from

"react-dom";

import from

"react-redux";

import from

"redux-arena";

import componenta from

"./componenta";//上面匯出的高階元件

const store = createarenastore();

reactdom.render(

store=>

provider>,);

複製**

非常的簡單。

每個scene預設只會接受自己所傳送的action,其他scene或者原生redux繫結的action,將會被忽略。

舉個例子:

import  from

"redux-arena/helper";

import * as actions from

"./actions";

import reducer from

"./reducer";

import componenta from

"./componenta";

export

const componenta1 = bundletocomponent();

export

const componenta2 = bundletocomponent();

複製**

componenta1和componenta2的****都是相同的,但是他們的reducer只會接收自己的scene內部傳送的action,其他元件傳送的action即使type相同,也會被忽略。

原生的redux中,如果要實現state的共享,需要為元件註冊乙個全域性唯一的reducerkey,然後使用mapstatetoprops方法,將對應state傳入props。

redux-arena使用了vitural reducerkey(vreducerkey),vreducerkey不要求全域性唯一,當子元件的vreducerkey與父元件的vreducerkey相同時,子元件的vreducerkey會覆蓋掉父元件的vreducerkey的資訊。

為scene指定vreducerkey:

import  from

"redux-arena/helper";

import * as actions from

"./actions";

import reducer from

"./reducer";

import componenta from

"./componenta";

export

default bundletocomponent(

});複製**

和mapstatetoprops相似,子元件使用propspicker取出所需要的state和actions:

import  from

"redux-arena/helper";

import state from

"./state";

import actions from

"./actions";

import componentachild from

"./componentachild";

export

default bundletocomponent()=>()

});複製**

這樣,我們就實現了元件間的state與actions的共享。

需要注意的是,這種共享模式類似flux的one-way data flow,傳遞方向是單向的,反向的資訊傳遞不能使用state,只能使用action。

如果是兄弟元件間的state共享,需要在這些兄弟元件間的某乙個父元件上增加乙個資料層,使用這個統一的父元件資料層共享狀態。

redux-arena提供了一系列的redux-saga方法實現通訊的隔離,使在redux-saga中可以只接收當前scene所派發的action。

使用setscenestate,可以方便的設定當前scene的state。

import  from

"redux-arena/sagaops";

function * dosomthing())

}export

function* saga ()

複製**

,具體使用可以參考專案目錄下的example,使用文件陸續補完中。

利用Map解決複雜業務

遍歷出題庫表的題庫名稱和題庫id,根據題目id即questionbankid獲取 分組,即該題庫題目總數,該題庫題目正確數,該題庫已回答題目數。sqltemplate id countanswerdquestion select question bank id select count 1 fro...

專案總結 複雜業務場景的設計與實現

我理解的複雜業務場景,指的是處理鏈路長 乙個完整流程需要多個節點處理 鏈路中某個節點的分支情況多 同一節點下根據不同業務型別有不同的處理邏輯 資料結構繁多且複雜 資料流入時結構越複雜,則說明處理內容增加,業務場景更為複雜 對於複雜的業務場景,建議可以從下面幾個方面參看處理 1.將處理鏈路分模組進行處...

複雜業務邏輯下的合理遍歷

我們在前端介面進行任務手動分配,要求將多條錄音隨機分配給多個質檢員。指定每個質檢員的錄音個數。1 錄音map key id,value time 2 質檢員id list 3 質檢員任務list number 4 需要質檢的錄音數量 1 將所有工單按照指定的分配數量分配給相應的質檢員 param w...