中间件的作用: 就是在 源数据 到 目标数据 中间做各种处理,有利于程序的可拓展性,通常情况下,一个中间件就是一个函数,且一个中间件最好只做一件事情
数据源 --------> 中间件 --------> 中间件 --------> 中间件 --------> 目标数据
applymiddleware将一堆函数封装成一个函数,这些函数的执行顺序由next传递
柯里化:多参函数->单参函数
applyMiddleware(xxxx, xxxx)
在store 目录下新建 middleware 文件,并创建文件 thunk.js
export defualt ({dispatch}) => next => action => {
if (typeof action === 'function') return action(dispatch)
return next(action)
}
当前这个中间件西数不关心你想执行什么样的异步操作 只关心你执行的是不是异步操作
如果你执行的是异步操作 你在触发action的时候 给我传递一个函数 如果执行的是同步操作 就往下执行
异步操作代码要写在你传递进来的函数中
当前这个中间件函数在调用你传递进来的西数时 要将dispatch方法传递过去
在 store 中引入
index.js
import { legacy_createStore as createStore, applyMiddleware } from "redux";
import reducer from "./reducers/root.reducer";
import thunk from "./middleware/thunk";
const store = createStore(reducer, applyMiddleware(thunk))
export default store
使用
modal.actions.js
import { CHANGEMODALSHOW } from '../const/modal.const'
export const changeModalShow = value => ({type: CHANGEMODALSHOW, value})
export const changeModalShow_async = value => dispatch => {
setTimeout(()=> {
dispatch(changeModalShow(value))
}, 2000)
}
Modal.js
import React from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import * as modalActions from '../store/actions/modal.actions'
const Modal = ({isShowModal, changeModalShow, changeModalShow_async}) => {
const styles = {
width: '400px',
height: '400px',
left: '50%',
top: '50%',
position: 'absolute',
transform: 'translate(-50%, -50%)',
background: 'aliceblue',
display: isShowModal ? 'block' : 'none'
}
const handelShowModal = () => {
changeModalShow_async(true)
}
const handelHiddenModal = () => {
changeModalShow(false)
}
return (
)
}
const mapStateToProps = state => ({
isShowModal: state.modal.isShowModal
})
const mapDispatchToProps = dispatch => bindActionCreators(modalActions, dispatch)
export default connect(mapStateToProps, mapDispatchToProps)(Modal)
Redux 的Thunk中间件。它允许编写内部带有逻辑的函数,可以与 Redux 存储dispatch
和getState
方法进行交互
npm install redux-thunk
import { legacy_createStore as createStore, applyMiddleware } from "redux";
import reducer from "./reducers/root.reducer";
import thunk from "redux-thunk";
const store = createStore(reducer, applyMiddleware(thunk))
export default store
效果是跟自己手写thunk效果一样的