内容简介:所谓中间件,一定是处于两个事物的中间,那么什么是Redux中间件呢?回顾一下Redux的工作流程:Redux的中间件,处于Action和Reducer之间,将中间某个过程拦截一下,进行一些处理再继续正常执行,这就是中间件的功能。
所谓中间件,一定是处于两个事物的中间,那么什么是Redux中间件呢?
回顾一下Redux的工作流程:
Redux的中间件,处于Action和Reducer之间,将中间某个过程拦截一下,进行一些处理再继续正常执行,这就是中间件的功能。
那为什么要用到Redux中间件呢?
对于异步请求的代码,我们最好将它们放到Redux中间件里面。
当项目复杂到一定规模的时候,我们希望让各个模块尽可能的实行单一职责,比如React作为一个视图层的框架就只负责渲染,数据的事情统统交给Redux来处理,此时,相对于把异步请求的Ajax代码放到写到组件的componentDidMount生命周期钩子函数,其实交给Redux是一种更好的选择。另外,交给Redux,一方面能够做到不同组件的接口复用,另一方面方便于测试,单纯去测试一些异步代码比测试一个React组件的生命周期函数会更加容易。 然而Redux里面dispatch的过程中只允许传递对象,而不允许传递函数。于是,redux-thunk便应运而生。
二、Redux-thunk实现异步更新state
npm install redux-thunk --save 复制代码
首先在项目中启用redux-thunk
//src/store/index.js
import {createStore, applyMiddleware, compose} from 'redux';
import reducer from './reducer';
import thunk from 'redux-thunk'
import TodoSagas from './sagas'
//需要同时激活redux-devtools的chrome插件,下面是激活代码
//兼容代码在redux-devtools的文档下拿过来照着用即可
const composeEnhancers =
typeof window === 'object' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose;
const enhancer = composeEnhancers(applyMiddleware(thunk))
//创建store
const store = createStore(
reducer,
enhancer
)
export default store;
复制代码
//src/store/actionCreators.js
//以下为getTodoList部分
export const getTodoList = () => {
return (dispatch) => {
axios.get('xxx').then((res) => {
const data = res.data.list
//创建action
const action = initListAction(data)
//相当于store.dispatch
//其实redux-thunk给当前返回函数中添加的第一个默认参数就是store的dispatch方法
dispatch(action)
})
}
}
复制代码
//App.js
componentDidMount() {
// axios.get('xxx').then((res) => {
// const data = res.data.data
// const action = initListAction(data)
// store.dispatch(action)
// })
//将以上代码放进Redux,效果相同
const action = getTodoList()
store.dispatch(action)
}
复制代码
因此,redux-thunk其实是拦截了store的dispatch方法,Redux中store.dispatch原本是不能传一个函数进去的,但是redux-thunk让dispatch拥有的接受函数参数的能力。具体来说,如果dispatch方法中传递的是一个对象,那么直接按照正常的Redux工作流来运行,但如果是一个函数,那么直接执行它,并把store.dispatch这个方法当作第一个参数传进这个函数。
三、Redux-saga实现异步更新state
redux-saga也是Redux中处理异步函数的中间件。
npm install redux-saga --save 复制代码
首先在项目中启动redux-saga:
//src/store/index.js
import {createStore, applyMiddleware, compose} from 'redux';
import reducer from './reducer';
import createSagaMiddleware from 'redux-saga'
import TodoSagas from './sagas'
//创建中间件
const sagaMiddleware = createSagaMiddleware()
//需要同时激活redux-devtools的chrome插件,下面是激活代码
const composeEnhancers =
typeof window === 'object' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose;
const enhancer = composeEnhancers(applyMiddleware(sagaMiddleware))
//创建store
const store = createStore(
reducer,
enhancer
)
//启动中间件
sagaMiddleware.run(TodoSagas)
export default store;
复制代码
//sagas.js
import { takeEvery, put } from 'redux-saga/effects'
import { GET_INIT_LIST } from './actionTypes';
import { initListAction } from './actionCreators';
import axios from 'axios'
function* getInitList() {
try {
const res = yield axios.get('xxx')
//拿到Ajax数据后,通过initListAction创建action对象
//注意: 这是另一个action:INIT_LIST_ACTION,直接改变state中的list的值
const action = initListAction(res.data.list)
//put相当于dispatch这个新的action
yield put(action)
}catch(e) {
console.log('网络请求失败')
}
}
//导出的mySaga需要写成一个Generator函数,异步处理函数getInitList也应是Generator函数
function* mySaga() {
//拦截GET_INIT_LIST这个action
yield takeEvery(GET_INIT_LIST, getInitList);
}
export default mySaga
复制代码
//App.js
componentDidMount() {
const action = getInitList()
store.dispatch(action)
}
复制代码
所以你能够看到,在redux-saga当中的处理思路是: 先抛出一个类似于信号灯的action,redux-saga看到了这个信号灯,拦截下来,然后执行响应的异步函数,在这个异步函数拿到数据后,执行真正要更新state的action。在这个过程中,作为信号灯的action在reducer中并没有具体关于state的逻辑编写,而仅仅是给redux-saga发一个信号而已。
关于redux中间件一点小小的总结,希望对大家有所帮助。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Apache ShardingSphere 开源分布式数据库中间件应用详解
- Mysql中间件应用之使用ProxySQL进行数据库读写分离
- ThinkPHP 6.0 RC5 发布,多应用模式独立及中间件机制调整
- Asp.Net Core 中间件应用实践中你不知道的那些事
- 消息中间件面试题:消息中间件的高可用
- Django中间件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Namo Webeditor5.5一看就懂.
吳聲毅 / 金禾資訊 / 20040214 / NT$ 169
一看就懂系列書全以初學者的角度切入,全書以STEP BY STEP方式撰寫,並以豐富的圖片搭配教學,在最後更加上日常生活實例運用講解,一路學來一氣呵成。為了增進學習的效率更採用高級紙品全彩印刷,這麼好的書,您還在等什麼,一看就懂系列書保證是您最佳入門學習好伙伴。 本書特色: 1、一看就懂:Step by Step操作詳盡說明、讓您一看就懂 2、精選範例:精彩實務範例生動活......一起来看看 《Namo Webeditor5.5一看就懂.》 这本书的介绍吧!