/***** 参数校验阶段 *****/
// preloadedState和enhancer不能同时为function
if (
(typeof preloadedState === "function" && typeof enhancer === "function") ||
(typeof enhancer === "function" && typeof arguments[3] === "function")
) {
throw new Error(
"It looks like you are passing several store enhancers to " +
"createStore(). This is not supported. Instead, compose them " +
"together to a single function."
);
}
/**
* preloadedState是一个函数,没有enhancer参数时,preloadedState赋值给enhancer
*/
if (typeof preloadedState === "function" && typeof enhancer === "undefined") {
enhancer = preloadedState;
preloadedState = undefined;
}
// enhancer存在且必须是一个function
if (typeof enhancer !== "undefined") {
if (typeof enhancer !== "function") {
throw new Error("Expected the enhancer to be a function.");
}
/**
* 此种情况创建的store如下
* const store = createStore(rootReducer, applyMiddleware(...middlewares))
* 或者 createStore(reducer,preState,applyMiddleware(thunk))
* 由此可见 enhancer 为 applyMiddleware 执行时返回的高阶函数,具体解读可以查看 applyMiddleware 源码解析
*/
return enhancer(createStore)(reducer, preloadedState);
}
if (typeof reducer !== "function") {
throw new Error("Expected the reducer to be a function.");
}
变量命名
// 保存了当前的reducer函数,该reducer函数可以被动态替换掉
let currentReducer = reducer;
// 保存了当前的state数据
let currentState = preloadedState;
// 保存了当前注册的函数列表
let currentListeners = [];
// 保存下一个监听函数列表
let nextListeners = currentListeners;
// 是否正在dispatch一个action
let isDispatching = false;
getState 方法
/**
* 获取当前state树,以获取当前状态
*/
function getState() {
// dispatch 方法未触发 action 前,无法获取当前 state 树
if (isDispatching) {
throw new Error(
"You may not call store.getState() while the reducer is executing. " +
"The reducer has already received the state as an argument. " +
"Pass it down from the top reducer instead of reading it from the store."
);
}
return currentState;
}
createStore.js
骨架设置监听器:
dispatch
接收action
对象为参数,这个对象是通过isPlainObject()
方法判断的纯正对象,分发 action。这是触发 state 变化的惟一途径。action
对象标准格式action creator
格式:一个简易的 observable 实现,用的太少,只看了实现,可以在平常的代码试用