【发布时间】:2020-01-14 10:58:12
【问题描述】:
当我使用 redux 时可以提供增强器,我自己编写了增强器并返回 redux devtool 增强存储:
const myCreateStore = (reducer, initialState, enhancer) => {
console.log('xxxxxx', initialState);
return createStore(reducer, initialState, enhancer);
};
const defaultState ={count:1};
const store = myCreateStore(
reducer,
defaultState,
() => (reducer, initialState) => {
return window.__REDUX_DEVTOOLS_EXTENSION__()(
myCreateStore
)(reducer, initialState);
}
);
当 redux 开发工具调用 myCreateStore 时,initalState 是未定义的。
当我创建 my own redux store 时,我无法将开发工具连接到商店。
//just ignore initial state since dev tools doesn't pass it
// use state=initialState in reducer
const createStore = (reducer, nothing, enhancer) => {
let listeners = [];
if (typeof enhancer === 'function') {
const devToolStore = enhancer(createStore)(reducer);
//cannot return devToolStore because it's broken
// getState will always try to return one currentStateIndex
// too far
window.devTool = devToolStore;
//you can run devTool.dispatch({type:'UP',id:0})
// and it'll show up in the redux dev tool but
// currentStateIndex is falsely set so getState
// won't work and the last action shows state as
// undefined
// return devToolStore;
return createStore(reducer);
}
const s = {
getState: () => s.value,
subscribe: listener => {
listeners.push(listener);
return () =>
(listeners = listeners.filter(l => l !== listener));
},
value: undefined,
setValue: newValue => {
if (s.value === newValue) {
return;
}
s.value = newValue;
listeners.forEach(listener => listener(newValue));
},
dispatch: action =>
s.setValue(reducer(s.getState(), action)),
reducer,
};
s.dispatch({ type: '@@INIT' });
return s;
};
沙盒是here(在 store.js 中)
【问题讨论】: