简易版redux实现

redux其实只有几个重要的api,getState,subscribe和dispatch,getState用来获取状态,subscribe监听状态的改变,dispatch派发事件改变状态,下面就来看下。首先是createStore,它接收三个参数,分别是reducer函数,初始状态值,还有就是中间件

function createStore(reducer,[initialState],enhancer){
    if(enhancer){return enhancer(createStore)(reducer,[initialState])
    var currentState=initialState?initialState:'';
    var currentReducer=reducer;
    var listeners=[];
    
    function getState(){
        return currentState;}
    
    function subscribe(listen){
        listeners.push(listen);}
    
    function dispatch(action){
        currentState=currentReducer(currentState,action);
        listeners.forEach(listen=>listen())
    }
        return {dispatch,store,subscribe}
}

这三个都比较简单,下面看一下中间件实现,首先是applyMiddleWare,它就相当于enhancer

function applyMiddleWare(...middlewares){
        return function(createStore){
            return function(reducer,[initialState]){
                const store=createStore(reducer,[initialState]);
                let dispatch=store.dispatch;
                const chain=[]
                const myStore={state:store.getState,
                               dispatch:...args=>{dispatch(...args)}}
                chain=middlewares.map(arg=>{arg(myStore)});
                dispatch=compose(...chain)(store.dispatch);
        return{...store,dispatch}
    
    }

applyMiddleWare是层层包裹的匿名函数,它会为每个中间件派发store,让每个middleware带着store执行一遍,执行的结果存储在chain数组里面,然后将chain数组作为参数传给compose函数,这是一个类似koa洋葱模型的函数

function compose(...fun){
        if(fun.length===0)return arg=>arg
        if(fun.length===1)return fun[0]
        return fun.reduce((left,right)=>(...args)=>{left(right(...args))})
    }

基本上就是这样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值