假设在我的react-redux应用程序的状态下有一个tree,而tree属于myReducer。在很多情况下,我需要展平这棵树,所以我有一个选择器:
const getTree = state => state.myReducer.tree;
export const getFlatNodes = createSelector(
[getTree],
(tree) => flattenTree(tree)
);现在我需要在一个操作中访问扁平化的树
import { getFlatNodes } from 'path/to/selectors';
function myReducer(state = defaultState, action) {
switch (action.type) {
case SOME_ACTION:
const flattenedTree = getFlatNodes(state);
return {
...state,
smth: getSmthFromFlattenedTree(flattenedTree)
};
}
}这段代码不会像预期的那样工作,因为reducer中的state只是应用程序状态的一小部分。我想出了一个简单的解决办法,就是包装state,使传递的参数兼容:
import { getFlatNodes as _getFlatNodes } from 'path/to/selectors';
const getFlatNodes = myReducer => _getFlatNodes({ myReducer });代码可以工作,尽管它看起来很粗糙,而且我不确定它是否不会造成任何问题。
有没有人知道为什么以及如何做得更好,或者我的方法已经足够好了?
发布于 2018-11-23 21:53:04
也许如果你在行动中做到这一点
const someAction = () => (dispatch, getState) => ({
type: 'SOME_ACTION',
payload: getFlatNodes(getState())
// payload: getSmthFromFlattenedTree(getFlatNodes(getState()))
});然后在你的减速器里
function myReducer(state = defaultState, action) {
switch (action.type) {
case SOME_ACTION:
return {
...state,
smth: getSmthFromFlattenedTree(action.payload)
};
}
}https://stackoverflow.com/questions/53430488
复制相似问题