redux3 中间件

16 篇文章 0 订阅
8 篇文章 0 订阅

redux 中间件

redux中间件书写

  • 中间件本身是一个函数,该函数接收一个store参数,表示创建的仓库,该仓库并非一个完整的仓库对象,仅包含getState,dispatch。 该函数运行的时间,是在仓库创建之后运行。
    • 由于创建仓库需要自动运行设置的中间件函数,因此需要在创建仓库时,告诉仓库有哪些中间件
    • 需要调用applyMiddleware函数,将函数的返回结果作为createStore的第二个或第三个参数。
  • 中间件函数必须返回一个dispatch创建函数
import { createStore, applyMiddleware } from "redux";


//
function logger1(store) {
    // next 是dispatch
    return function(next) {
        //下面返回的函数是最终要应用的函数
        return function(action){
            console.log("中间件1");
            console.log("旧数据", store.getState());
            console.log("action", action);
            next(action)
            console.log("新数据", store.getState());
        }
    }
}

function logger2() {
    // next 是logger1的dispatch
    return function(next) {
        //下面返回的函数是最终要应用的函数
        return function(action){
            console.log("中间件2");
            console.log("旧数据", store.getState());
            console.log("action", action);
            next(action)
            console.log("新数据", store.getState());
        }
    }
}

//中间件的另一个写法
const logger3 = next =>action =>{
            console.log("中间件2");
            console.log("旧数据", store.getState());
            console.log("action", action);
            next(action)
            console.log("新数据", store.getState());
        }

const store = createStore(reducer, 10, applyMiddleware(logger1, logger2, logger3));

const actionCreators = {
    addUser: createAddUserAction,
    deleteUser: createDeleteUserAction
}

bindActionCreators(actionCreators, store.dispatch)
  • applyMiddlewares函数,用于记录有哪些中间件,它会返回一个函数
    • 该函数用于记录创建仓库的方法,然后返回一个函数
// 运用中间件,方式1
const store = createStore(reducer, 10, applyMiddleware(logger1, logger2, logger3)); 

//运用中间件,方式2
applyMiddleware(logger1, logger2, logger3)(createStore)(reducer)

手写applyMiddleware

middleware的本质,是一个调用后可以得到dispatch创建函数的函数

compose: 函数组合,将一个数组中的函数进行组合,形成一个新的函数,该函数调用时,实际上是反向调用之前的函数


/**
 * compose: 函数组合,将一个数组中的函数进行组合,形成一个新的函数,该函数调用时,实际上是反向调用之前的函数
 * @param  {...any} funcs 
 */
export default function compose(...funcs){

    if (funcs.length === 0 ) {
        return args => args; //如果没有组合的函数,则返回原封不动的返回参数
    }
    else if(funcs.length === 1) {
        //要组合的函数只有一个
        return funcs[0]
    }

    
    // return function(...args) {
    //     let lastReturn = null;//记录上一个函数返回的值,它将作为下一个函数的参数
    //     for(let i=funcs.length - 1; i >= 0; i--){
        //         const func = funcs[i]
        //         if(i === funcs.length - 1){//数组最后一项
        //             lastReturn = func(...args)
        //         }
        //         else {
            //             lastReturn = func(lastReturn)
            //         }
            //     }
            //     return lastReturn
            // }

        //以上注释的简化如下
         return funcs.reduce((a,b) => (...args) => a(b(...args)))
        
        }

function func1(n) {
    return n*2
}

function func2(n) {
    return n + n
}

var func = compose(func1,func2)

var result = func(3); //得到12
console.log(result);

applyMiddleware

import compose from './compose'
/**
 * 注册中间件
 * @param  {...any} midleWares 所有的中间件
 */

import { createStore } from "redux"

export default function(...midleWares){
    return function (creaeteStore) { //创建仓库的函数
        //下面的函数用于创建仓库
        return function(reducer, defaultState) {
            //创建仓库
            const store = createStore(reducer, defaultState)
            let dispatch = () => { throw new Error("目前还不能使用dispatch")}

            const simpleStore = {
                getState: store.getState,
                dispatch: store.dispatch
            }

            //给dispatch赋值
            //根据中间件数组,得到一个dispatch创建函数的数据
            const dispatchProducers = midleWares.map(mid => mid(simpleStore))
            dispatch = compose(...dispatchProducers)(store.dispatch)
            return{
                ...store,
                dispatch
            }
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux中,常用的中间件redux-thunk、redux-saga和redux-logger。redux-thunk的主要作用是可以使action可以变成函数形式,接收两个参数dispatch和getState,可以进行异步操作。redux-saga是一个强大的异步处理库,它使用了ES6的Generator函数来处理异步流程,可以更加清晰和可控地管理副作用。redux-logger的主要作用是在控制台打印输出新老state等信息,方便开发调试。这些中间件在开发过程中可以提高代码的可读性和可维护性,使开发者更方便地处理异步操作和调试程序。此外,react-reduxRedux官方提供的用于配合React的绑定库,它提供了Provider和connect这两个重要的成员,可以更方便地在React组件中使用Redux的状态和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【面试题】redux中间件相关面试题&解析](https://blog.csdn.net/Ronychen/article/details/125679270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [React,Redix面试题](https://blog.csdn.net/qq_48962360/article/details/127098928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值