Redux

93 阅读1分钟

reducer就是一个纯函数,接收旧的state和aacion 返回新的state

reducer不能做的操作:

1.修改传入的参数

2.执行有副作用的操作,如api请求

3.调用非纯函数 如Date.now()或Math.random()

redux

Redux是javaacript应用的状态容器 保证程序行为的一致性且容易测试

Redux只是个纯粹的状态管理器,默认只支持同步,实现异步任务 比如延迟,网络请求,需要中间件的支持,你如我们使用最简单的redux-thunk和redux-logger

ReduxPage.js

  import React,{Component} from "react"
  import store from "../store"
  export default class ReduxPage extends Component{
    componentDidMount(){
      this.unsubscribe=store.subscribe(()=>{
        this.forUpdate()//更新组件
      })
    }
    componentWillUnmount(){
      if(this.unsubscribe){
        this.subscribe()
      }
    }
    //同步的action
    add=()=>{
     store.dispatch()
    }
    //异步的action 需要使用中间件
    asyAdd=()=>{
      store.dispatch(()=>{
        setTimeout(()=>{
          store.dipatch({{type:"ADD"})
        },1000)
      })
    }
    render(){
      return(
       <div>
         <h3>
           ReduxPage
         </h3>
         <p>{store.getState()}<p/>
         <button onClick={this.add}>add</button>
       </div>
       
      )
    }
  }

建立store

index.js

import {createStore,applyMiddleware} from "redux"
import thunk from "redux-thunk"
import logger from "redux-logger"
function countReducer=(state=0,action){
  switch(action.type){
     case: "ADD":
      return state+1;
      case:"MINUS":
      return state-1;
      default: return state
   }
}
const store=createStore(countReducer,applyMiddleware(thunk,logger));

export default store;

createStore.js


export default function createStore(reducer,enhancer){
  if(enhancer){
  //加强dispatch
    enhancer(createStore)(reducer)
  }
  let currentState;
  let currentListeners=[]
  function getState(){
    return currentState;
    
  }
  function dispatch(action){
      currentState=reducer(currentState,action);
      currentListeners.forEach(listener=>listener());
  } 
  function subscribe(listener){
     currentListeners.push(listener)
     return ()=>{
       currentListeners=[]
     }
  }
  //初始值
  dispatch({})
  return{
    getState,
    dispatch,
    subscribe
  }


}

实现applyMiddleware

 export default function applyMiddleware(...middlewares){
    return createStore=>reduer=>{
      const store=createStore(reducer)
      let dispatch=store.dispatch
      
      //加强后的dispatch
      const midApi={
       getState:store.getState,
       dispatch:(action,...args)=>dispatch(action,...args)
      }
const middlewareChain=middlewareChain.map(middleware=>middleware(midApi))
       dispatch=compose(...middlewareChain)(store.dispatch)
       //加强dispatch
      return{
        ...store,
        //加强后的dispatch
        dispatch
      }
    }
 }

实现logger

  fucntion logger({getState}){
    return next=>action=>{
     let prevState=getState()
     const returnValue=next(action)
     let newState=getState()
     return returnValue()
    }
  }

实现thunk

function thunk({dispatch,getState){
   return next=>action=>{
     if(typeof action=='function'){
        return action(dispatch,getState);
      }
      return next(action)
   }
}