繁体   English   中英

Redux减速机 - 关于状态变化

[英]Redux reducer - on state change

我想将特定reducer的当前状态保存到会话存储中,而不是在每个操作上显式调用它。

const { handleActions } = require("redux-actions");

// How do i make this logic run on any state change without adding it to every action?
const onStateChange = (state) => sessionStorage.save(keys.myReducer, state);

const myReducer = handleActions
({
     [Actions.action1]: (state, action) => (
         update(state, {
             prop1: {$set: action.payload},
         })
     ),
     [Actions.action2]: (state, action) => (
         update(state, {
             prop2: {$set: action.payload},
         })
     )
 },
 //****************INITIAL STATE***********************
 {
     prop1: [],
     prop2: []
 }
);

有没有办法捕获特定减速器的状态更改事件?

我知道store.subscribe ,但那是整个商店,我说的是听一个特定的减速器更改

谢谢

遗憾的是,您无法观看商店的特定部分,因为您的商店实际上只是减速器(combineReducers返回一个大型减速器)。 也就是说,您可以通过状态部分比较手动检查减速器是否已更改。

let previousMyReducer = store.getState().myReducer;
store.subscribe(() => {
  const { myReducer } = store.getState();
  if (previousMyReducer !== myReducer) {
    // store myReducer to sessionStorage here
    previousMyReducer = myReducer;
  }
})

您可以使用redux-saga来侦听特定操作,并在触发时保留存储(以及执行其他操作)。 这似乎非常适合您的需求。

它与特定的商店更改并不完全相关,而是与一组操作相关联。 但是,我认为这个模型(倾听动作,而不是状态变化)更适合redux设计。

好消息是你不必更改传奇之外的任何代码。 我已经使用这个来自动保存表单数据并且效果很好。

这是一个设置一个saga以坚持一些redux-form动作的例子; 请注意,它不仅限于坚持 - 你可以在传奇期间做任何你想做的事情。

function* autosaveSaga(apiClient) {
  yield throttle(500,
  reduxFormActionTypes.CHANGE,
    saveFormValues,
    apiClient);

  yield takeLatest(
    reduxFormActionTypes.ARRAY_PUSH,
    saveFormValues,
    apiClient);

  yield takeLatest(
    reduxFormActionTypes.ARRAY_POP,
    saveFormValues,
    apiClient);
 }

如果您想要监听所有操作类型,或者自定义过滤哪些操作会激活您的持久性代码,您可以传递模式或匹配函数来获取最新:

   yield takeLatest(
    '*',
    saveFormValues,
    apiClient);

更多关于您可以通到什么taketakeLatest等,可以发现在文档的take

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM