優雅的redux異步中間件 redux-effect

不吹不黑,redux蠻好用。只是有時略顯繁瑣,叫我定義每一個action、action type、使用時還要在組件上綁定一遍,臣妾做不到呀!下面分享一種個人比較傾向的極簡寫法,仍有待完善,望討論。

github: github.com/liumin1128/…

基于redux、async/await、無侵入、兼容性良好的異步狀態管理器。

install

npm i -S redux-effect// or
yarn add redux-effect
復制代碼

use

import { createStore, applyMiddleware, combineReducers } from 'redux';
import { reduxReduers, reduxEffects } from 'redux-effect';const models = [ test1, test2, ...];const reducers = combineReducers(reduxReduers(models));
const middlewares = [ reduxEffects(models) ];const store = createStore(reducers,initialState,middlewares);
復制代碼

從代碼可以看出,從reduxReduers, reduxEffects中得到的就是標準的reducer和middleware,完美兼容其他redux插件,也可以輕松整合進老項目中。

完整例子:example

model

在redux-effect中,沒有action的概念,也不需要定義action type。

所有關于某個state的一切聲明在一個model中,本質就是一個對象。

export default {namespace: 'test',state: { text: 'hi!' },reducers: {save: (state, { payload }) => ({ ...state, ...payload }),clear: () => ({})},effects: {fetch: async ({ getState,dispatch }, { payload }) => {await sleep(3000);await dispatch({ type: 'test/clear' });await sleep(3000);await dispatch({ type: 'test/save', payload: { text: 'hello world' } });}}
};復制代碼

namespace:

model的命名空間,對應state的名字,必填,只接受一個字符串。

state:

state的初始值,非必填,默認為空對象

reducers:

必填,相當于同步執行的action方法,接受兩個參數state和action,合并后返回新的state狀態值。

effects:

非必填,相當于異步執行的action方法,接受兩個參數store和action,store里包括redux自帶的getState和dispatch方法,action為用戶dispatch時帶的參數。

dispatch

這里的dispatch就是redux中的dispatch,但有幾個約定。

  1. 不傳定義好的action,而是直接傳一個普通對象。
  2. type的組織形式:namespace + '/' + reducer或effect方法名
  3. 參數的傳遞:需要合并的參數用payload包裹

定義每一個action,并將其綁定到視圖層過于繁瑣,去action化則讓事件的觸發變的靈活。

普通事件

發送事件時,不區分同步還是異步,只管dispatch,一切都已在model中定義好。

// 同步
dispatch({ type: 'test/save', payload: { text: "hello world" } })
// 異步
dispatch({ type: 'test/fetch' })
復制代碼

等待

等待一個事件完成再執行邏輯,dispatch方法是可以被await的,十分輕松。

async function test() {await dispatch({ type: 'test/fetch' })await console.log('hello world')
}
復制代碼

回調

等待某個事件,再執行外部定義的某個回調函數,只需要在action字段里加上callback方法,在effect中調用即可。

相比較await,回調可以拿到某些返回值,也可以在effect流程的中間部分執行。


dispatch({ type: 'test/fetch', callback1, callback2 }){effects: {fetch: async ({ getState,dispatch }, { payload, callback, callback2 }) => {const state = await getState()await sleep(3000);await callback1(state)await sleep(3000);await callback2(state)}}
}
復制代碼

自定義reducer

reducer其實就是redux中的reducer,用法完全一樣。比如定義一個push方法,將后續數據,壓入到原有數據后面,可以這樣寫。

export default {namespace: 'test',state: { data: [] },reducers: {save: (state, { payload }) => ({ ...state, ...payload }),clear: () => ({}),push: (state, { payload = {} }) => {const { key = 'data', data } = payload;return { ...state, [key]: state[key].concat(data) };}},
};
復制代碼

自定義effect

effect其實就是一個普通async函數,接受store和action兩個參數,可以使用async/await,可以執行任意異步方法,可以隨時拿到state的值,可以dispatch觸發另一個effect或者reducer。

loading

也許你會想監聽某個effect,拿到loading狀態,以便在ui給用戶一個反饋。一般情況下監聽一個異步方法,只需要在effect的開頭和結束,各自設定狀態即可,與常規寫法無異。

但這里也提供一種model級別的loading狀態,新增一個名為loading的model,再使用reduxEffectsWithLoading包裹需要監聽的model即可。

關于model-creator

以上所做的事情,是將redux核心規范為model,得到了統一且可以復用的數據模型,這為自動生成model創造了可能性,如果能通過工廠模式,自動化創建具有類似功能,且可以隨意裝配的model,一切將變得更加美好。

Coming Soon

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536629.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536629.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536629.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle 中累加函數,Oracle 分析函數分組累加!

用戶號碼 登陸時間13000000002010-01-0113000000012010-01-0113000000022010-01-0213000000012010-01-0213000000032010-01-0313000000022010-01-0313000000042010-01-0413000000032010-01-0413000000042010-01-0213000000062011-01-0413000000012011-01-04剔除重復登陸的用戶,…

asp.net core系列 48 Identity 身份模型自定義

一.概述 ASP.NET Core Identity提供了一個框架,用于管理和存儲在 ASP.NET Core 應用中的用戶帳戶。 Identity添加到項目時單個用戶帳戶選擇作為身份驗證機制。 默認情況下,Identity可以使用的 Entity Framework (EF) Core 數據模型。 本文介紹如何自定義…

oracle中創建游標,oracle 存儲過程創建游標

Oracle與Sql Server差異點詳解1、create函數或存儲過程異同點Oracle 創建函數或存儲過程一般是 create or replace ……SQL SERVER 則是在創建之前加一條語句,先判斷是否已經存在,如果存在刪除已有的函數或存儲過程。函數語句:if exists (sel…

hosts文件不起作用

突然發現電腦的hosts文件不起作用了。之前用的狠正常,近期也沒有修改過。首先排除什么格式、DNS、注冊表之類的問題。最終解決辦法(權限問題:有問題的hosts文件圖標上有個鎖):1.C:\Windows\System32\drivers\etc下復制…

oracle面臨的挑戰,未來數據庫管理員面臨的三大挑戰

原標題:未來數據庫管理員面臨的三大挑戰前言今天的數據庫管理員面臨著三大挑戰:工作重心向以應用程序為中心轉移、支持多個數據庫平臺的需求、在云端以及在本地管理數據庫性能的責任不斷擴大。為了在今天和未來都能站穩腳跟,數據庫管理員需要…

Reducer拆分

看到Redux官網上Reducer拆分后,最后生成的state的組合有點懵,主要是對combineReducers()這個工具類不了解,其實該方法是消除了一些樣板代碼。 如todoApp事例: import { combineReducers } from reduxconst todoApp combineReduce…

oracle中asmcmd,ASM工具asmcmd

Oracle的ASM一直不夠透明,但Oracle還是提供了一些工具來訪問ASM磁盤組的,asmcdm就是其中一個工具,本文將對其進行詳細介紹。感覺Oracle的ASM一直很不透明,不過Oracle還是提供了一些工具來訪問ASM磁盤組的,asmcdm就是其中一個工具。…

php頁面底部信息居中,css底部如何局中?css三種居中方法

本篇文章給大家帶來的內容是關于css底部如何局中?css三種居中方法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。某天組長讓我改一個表格的樣式,要求底部局中。當時想很簡單的嘛,哼哧哼哧…

打造汽車“安卓平臺”,大眾或親手干掉傳統汽車產業

干掉傳統汽車產業的,很可能是大眾,而不是特斯拉。 于無聲處聽驚雷。 2019年的日內瓦車展,看起來并沒有傳出太大的新聞。汽車世界的目光,依然被特斯拉的喧囂所吸引。 然而,大眾汽車展臺上發生的一件看似不起眼的小事情&…

php返回101,PHP 101:變量與函數

功能很好.我看到功能徽標()比$logo更好. echo不占用太多內存,但$logo確實如此.即使函數logo()需要一些東西,它也將由PHP自己的垃圾收集器處理.您還可以使用這些函數來確保不會濫用分配的內存.> memory_get_peak_usage();> memory_get_usage();說明:Upon the e…

從 SPA 到 PWA:Web App的下一站在哪?

從AJAX(Asynchronous JavaScript XML,異步JavaScript和XML)開始, 尤其是 AngularJS 推出之后,SPA(Single Page App,單頁應用)已經成為前端 App 的必選方案。 SPA 可以在客戶端提供完…

php如何調用手機撥打電話,ionic調用手機系統的撥打電話

linux中wc命令用法Linux系統中的wc(Word Count)命令的功能為統計指定文件中的字節數.字數.行數,并將統計結果顯示輸出. 1.命令格式: wc [選項]文件... 2.命令功能: 統計指定文件中的字節數. ...POJ1364 King-差分Description Once, in one kingdom, ther…

使用class-validator替換Joi包的方法

前言 對每個接口的傳入參數進行校驗,是一個Web后端項目的必備功能,有一個npm包叫Joi可以很優雅的完成這個工作,比如這樣子: const schema {userId: Joi.string() }; const {error, value} Joi.validate({ userId: a string }, s…

linux服務器下降,linux - 遠程升級Ubuntu:如何最大程度地降低丟失服務器的風險? - Ubuntu問答...

問題描述背景:由于raid控制器的不兼容性問題,我被迫將服務器從Ubuntu 8.04 LTS遠程升級到10.04 LTS。與服務器的Internet連接比較穩定,很少掉線。盡管如此,我還是擔心在升級時會丟失通過SSH的連接,從而使服務器處于無法…

Linux中英文命令對應

本文我們把Linux的中英文命令做了對應翻譯,給需要的朋友參考一下。很多朋友在論壇上找Linux英文命令,我們給大家整理了比較全的Linux英文命令,并且附上了對應的中文意思。 su:Swith user 切換用戶,切換到root用戶 cat:…

linux實驗四文件安全,西北農林科技大學Linux實驗四 用戶和文件安全

一、 實驗目的實驗四 用戶和文件安全1. 理解用戶、組的概念2. 理解/etc/passwd、/etc/group、/etc/shadow文件 3. 練習useradd、groupadd、gpasswd、groups命令二、 實驗內容 1. 添加用戶 2. 添加組3. 添加用戶到工作組 4. 改變目錄原始組 5. 建立多個用戶共享的目錄6. 理解文件…

Unable to resolve dependency問題解決

Unable to resolve dependency 是一個讓我頭疼的問題 之前總是陰差陽錯調試好 但是也沒有總結出來方法 但是今天找到了 方法來源 https://jingyan.baidu.com/article/19192ad8c489dfe53e5707ee.html 原因就是用戶的gradle.properties 設置了代理,將文件內的代理注釋…

linux 服務器進程,如何查看Linux服務器的進程

Linux服務器正常啟動后,提供服務時會調用程序,占用進程。這時候如何查看系統中有哪些進程在被調用呢?我們可以通過以下命令來查看。1.psps命令是最基本同時也是非常強大的進程查看命令。使用該命令可以確定有哪些進程正在運行和它所運行的狀態…

計數排序與桶排序python實現

計數排序與桶排序python實現 計數排序 計數排序原理: 找到給定序列的最小值與最大值 創建一個長度為最大值-最小值1的數組,初始化都為0 然后遍歷原序列,并為數組中索引為當前值-最小值的值+1 此時數組中…

perl腳本執行linux命令行,Perl調用shell命令方法小結

一、systemperl也可以用system調用shell的命令,它和awk的system一樣,返回值也是它調用的命令的退出狀態.代碼如下:[rootAX3sp2 ~]# cat aa.pl#! /usr/bin/perl -w$file "wt.pl";system("ls -l wt.pl");$result system "ls -l $file";print &qu…