import ActionTypes from"./utils/ActionTypes"import isPlainObject from"./utils/isPlainObject"/**
* 实现createStore的功能
* @param {function} reducer reducer
* @param {any} defaultState 默认的状态值
*/exportdefaultfunctioncreateStore(reducer, defaultState, enhanced){//enhanced表示applymiddleware返回的函数if(typeof defaultState ==="function"){//第二个参数是应用中间件的函数返回值
enhanced = defaultState;
defaultState = undefined;}if(typeof enhanced ==="function"){//进入applyMiddleWare的处理逻辑returnenhanced(createStore)(reducer, defaultState);}let currentReducer = reducer,//当前使用的reducer
currentState = defaultState;//当前仓库中的状态const listeners =[];//记录所有的监听器(订阅者)functiondispatch(action){//验证actionif(!isPlainObject(action)){thrownewTypeError("action must be a plain object");}//验证action的type属性是否存在if(action.type === undefined){thrownewTypeError("action must has a property of type");}
currentState =currentReducer(currentState, action)//运行所有的订阅者(监听器)for(const listener of listeners){listener();}}functiongetState(){return currentState;}/**
* 添加一个监听器(订阅器)
*/functionsubscribe(listener){
listeners.push(listener);//将监听器加入到数组中let isRemove =false;//是否已经移除掉了returnfunction(){if(isRemove){return;}//将listener从数组中移除const index = listeners.indexOf(listener);
listeners.splice(index,1);
isRemove =true;}}//创建仓库时,需要分发一次初始的actiondispatch({
type: ActionTypes.INIT()})return{
dispatch,
getState,
subscribe
}}
combineReducers.js
import isPlainObject from"./utils/isPlainObject"import ActionTypes from"./utils/ActionTypes"functionvalidateReducers(reducers){if(typeof reducers !=="object"){thrownewTypeError("reducers must be an object");}if(!isPlainObject(reducers)){thrownewTypeError("reducers must be a plain object");}//验证reducer的返回结果是不是undefinedfor(const key in reducers){if(reducers.hasOwnProperty(key)){const reducer = reducers[key];//拿到reducer//传递一个特殊的type值let state =reducer(undefined,{
type: ActionTypes.INIT()})if(state === undefined){thrownewTypeError("reducers must not return undefined");}
state =reducer(undefined,{
type: ActionTypes.UNKNOWN()})if(state === undefined){thrownewTypeError("reducers must not return undefined");}}}}exportdefaultfunction(reducers){//1. 验证validateReducers(reducers);/**
* 返回的是一个reducer函数
*/returnfunction(state ={}, action){const newState ={};//要返回的新的状态for(const key in reducers){if(reducers.hasOwnProperty(key)){const reducer = reducers[key];
newState[key]=reducer(state[key], action);}}return newState;//返回状态}}
bindActionCreators.js
exportdefaultfunction(actionCreators, dispatch){if(typeof actionCreators ==="function"){returngetAutoDispatchActionCreator(actionCreators, dispatch);}elseif(typeof actionCreators ==="object"){const result ={};//返回结果for(const key in actionCreators){if(actionCreators.hasOwnProperty(key)){const actionCreator = actionCreators[key];//取出对应的属性值if(typeof actionCreator ==="function"){
result[key]=getAutoDispatchActionCreator(actionCreator, dispatch);}}}return result;}else{thrownewTypeError("actionCreators must be an object or function which means action creator")}}/**
* 得到一个自动分发的action创建函数
*/functiongetAutoDispatchActionCreator(actionCreator, dispatch){returnfunction(...args){const action =actionCreator(...args)dispatch(action);}}
compose.js
exportdefaultfunctioncompose(...funcs){if(funcs.length ===0){return args => args;//如果没有要组合的函数,则返回的函数原封不动的返回参数}elseif(funcs.length ===1){//要组合的函数只有一个return funcs[0];}return funcs.reduce((a, b)=>(...args)=>a(b(...args)))// 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;// }}
import isPlainObject from "./utils/isPlainObject"import ActionTypes from "./utils/ActionTypes"function validateReducers(reducers) { if (typeof reducers !== "object") { throw new TypeError("re...