Redux:对状态的调节动作

Redux: conditioning action on state

据我了解,action creator 没有状态视图,reducer 也不允许触发新的 action。那么,如何根据状态调节动作 - 是否需要在渲染函数中完成?

例如,我有一个列出项目集标题的组件。此数据存储在 state.matches 中。单击某个项目应该会在我的 Entries 组件中显示详细视图。

目前,我有这个动作创建者下载条目并触发动作 addEntry,这导致 entries reducer 将数据添加到 state.entries 中的缓存中。

export function getEntryFromId(id) {
  return function(dispatch) {
    dispatch(lookupInit(id));

    fetch('/register/id/' + id)
      .then( res => res.json() )
      .then( res => dispatch(addEntry(res[0])) )     // data returned as array of one element
      .catch( err => dispatch({ type: ENTRY_LOOKUP_FAIL }) );
  }
}

目前它总是下载新数据,因为它无法检查缓存。

另一种方法是将 id 作为 SHOW_THIS_NEXT 操作传递给条目端,此时 reducer 可以检查它是否在缓存中,如果不在则下载它。但是reducer不允许触发action,最终可能是forbidden.

如何平方这个圆。

我假设您正在使用 Redux Thunk 来处理 return 来自 getEntryFromId 的重击?您 return 的函数可以接受一个 getState 参数:

export function getEntryFromId(id) {
  return function(dispatch, getState) {
    const currentState = getState();
    // do something with `currentState`,
    // only dispatch if necessary
  }
}