首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在缩减程序中使用reselect-选择器

在缩减程序中使用reselect-选择器
EN

Stack Overflow用户
提问于 2018-11-22 19:55:34
回答 1查看 1.1K关注 0票数 1

假设在我的react-redux应用程序的状态下有一个tree,而tree属于myReducer。在很多情况下,我需要展平这棵树,所以我有一个选择器:

代码语言:javascript
复制
const getTree = state => state.myReducer.tree;

export const getFlatNodes = createSelector(
    [getTree],
    (tree) => flattenTree(tree)
);

现在我需要在一个操作中访问扁平化的树

代码语言:javascript
复制
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,使传递的参数兼容:

代码语言:javascript
复制
import { getFlatNodes as _getFlatNodes } from 'path/to/selectors';
const getFlatNodes = myReducer => _getFlatNodes({ myReducer });

代码可以工作,尽管它看起来很粗糙,而且我不确定它是否不会造成任何问题。

有没有人知道为什么以及如何做得更好,或者我的方法已经足够好了?

EN

回答 1

Stack Overflow用户

发布于 2018-11-23 21:53:04

也许如果你在行动中做到这一点

代码语言:javascript
复制
const someAction = () => (dispatch, getState) => ({
  type: 'SOME_ACTION',
  payload: getFlatNodes(getState())
  // payload: getSmthFromFlattenedTree(getFlatNodes(getState()))
});

然后在你的减速器里

代码语言:javascript
复制
function myReducer(state = defaultState, action) {
    switch (action.type) {
       case SOME_ACTION:
           return {
               ...state,
               smth: getSmthFromFlattenedTree(action.payload)
           };
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53430488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档