我正在使用Redux,如果用户修改了数据,想在状态中设置一个标志。
首先,我使用来自服务器的一些数据为商店充水:
let serverData = {toggle: true}
const store = configureStore({data: serverData, originalData: serverData})
然后,我有一些减速器:
function data(state = {}, action) {
switch (action.type) {
case TOGGLE:
return {
...state,
toggle: !state.toggle
}
default:
return state
}
}
function changed(state = false, action) {
// This doesn't work; we are actually comparing state.changed.originalData and state.changed.data
return isEqual(state.originalData, state.data)
}
const rootReducer = combineReducers({
data,
originalData: (state={}) => state,
changed
})
我想在这里做的就是将changed
标志设置为true,如果state.data
不再等于state.originalData
。但是,使用CombineReducers,我无法访问我的changed
reducer内部状态的这些部分。
什么是最惯用的方法?
Michelle是正确的,以传统的通量术语扩展它是将reducer视为商店,您只是将其中一个商店称为“数据”而另一个称为“已更改”-这不是语义,这表明您可能对它们的含义感到困惑用过的。
你changed
减速应该要么返回未修改的状态,或者,如果是做一个动作,它的兴趣,返回下一个状态。这不是为了弄清楚您的商店是否发生了变化,这subscribe
就是要这样做的。
const unsubscribe = store.subscribe(() =>
console.log('store was changed:', store.getState())
)
当您调用combineReducers
它时,它会以-的动作调用每个reducer一次,@@redux/INIT
但是不要担心,因为它是内部的。要了解的重要一点是,在每个reducer键下,状态都已初始化。在您的情况下,您将初始化data
为一个空对象,changed
false和originalData
一个空对象。
接下来,当您打来电话时,createStore
您说“使用服务器的初始状态更新'数据'和'原始数据'存储”。因此,现在“数据”和“ serverData”存储的状态等于{toggle: true}
。
此时,两个对象是相同的。
随后,当您调用store.dispatch
所有的reducer时,它们将有机会修改每个reducer键下的状态(并返回一个新对象)。每个reducer只能访问自己的状态。因此,在changed
减速器中,您无法像这样检查整个状态的整体对象相等性。
但是,您可以在订阅中检查对象是否相等(对于Chrome 47,此处为混合ES5 / 6)
'use strict';
const serverData = {toggle: true};
const TOGGLE = 'TOGGLE';
function data(state, action) {
state = state || {};
switch (action.type) {
case TOGGLE:
return Object.assign({}, state, {
toggle: !state.toggle
})
default:
return state
}
}
function originalData(state) {
state = state || {};
return state;
}
const rootReducer = Redux.combineReducers({
data,
originalData
});
const store = Redux.createStore(rootReducer, {data: serverData, originalData: serverData });
const unsubscribe = store.subscribe(() =>
console.log('on change equal?', store.getState().data === store.getState().originalData)
)
console.log('on load equal?', store.getState().data === store.getState().originalData);
store.dispatch({ type: TOGGLE });
console.log输出应为:
on load equal? true
on change equal? false
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句