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
}
}
据我了解,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
}
}