reactjs - 从 redux-saga 调用组合的重新选择选择器

标签 reactjs redux redux-saga reselect

我正在尝试从 redux-saga 调用组合选择器。我的想法是我有两个下拉菜单。第一个下拉列表中的选择将在第二个下拉列表中过滤出适当的值,即我的组合选择器将过滤掉一些不相关的值,因此它们不会显示在第二个下拉列表中:

1) 我有两个选择器,firstSelectorsecondSelector

// firstSelector returns {"Cat":["black","white"],"Dog":["grey"]}
const firstSelector= () =>
  createSelector(selectPage, substate => substate.firstDropDown);

// secondSelector returns ["black","grey"]
const secondSelector= () =>
  createSelector(selectPage, substate => substate.secondDropDown);

2) 我将它们组合在组合选择器中(应该返回 ["black", "grey"],即“white”被过滤掉)

const filterBySelection = (firstSelector, secondSelector) =>
  createSelector(
    [
      firstSelector, 
      secondSelector, 
    ],
    (first, second) => {
      const filteredValues = Object.keys(first).reduce(
        (r, k) => r.concat(first[k]),
        [],
      );
      return second.filter(val => filteredValues.indexOf(val) >= 0);
    },
  );

3) 但是如何在 redux-saga 中调用 filterBySelection 呢? 我试过了:

const filteredValues = yield select(
  filterBySelection,
  firstSelector,
  secondSelector,
);

const filteredValues = yield select(
  filterBySelection(firstSelector, secondSelector)()
);

const filteredValues = yield select(
  filterBySelection(firstSelector, secondSelector)
);

但是这些方法都行不通。

不过,我可以调用 firstSelectorsecondSelector,即有效:

const firstData= yield select(firstSelector());

有人会说我可以在 redux-saga 中简单地执行以下操作:

const first = yield select(firstSelector());
const second = yield select(secondSelector());
const filtered = Object.keys(first).reduce(
  (r, k) => r.concat(first[k]),
  [],
);
const secondFiltered = second.filter(
  val => first.indexOf(val) >= 0,
);

但这将不内存,而我们的想法是内存

那么可以在 redux-saga 中使用内存选择器吗?

最好的问候

最佳答案

您似乎错过了调用返回选择器的函数。所以,要么:

一)

const filterBySelection = (firstSelector, secondSelector) =>
  createSelector(
    [
       firstSelector(), // <- parentheses 
       secondSelector(), // <- parentheses 
     ], ... )

然后:const filteredValues = yield select( filterBySelection(第一个选择器,第二个选择器) );

b) 正确传递选择器

const filteredValues = yield select(
  filterBySelection(firstSelector(), secondSelector())
);

c) 定义没有函数的firstSelectorsecondSelector(也许是最正确的方式):

const firstSelector = 
  createSelector(selectPage, substate => substate.firstDropDown);

const secondSelector = 
  createSelector(selectPage, substate => substate.secondDropDown);

然后

const filteredValues = yield select(
  filterBySelection(firstSelector, secondSelector)
);

希望对您有所帮助。

关于reactjs - 从 redux-saga 调用组合的重新选择选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54882185/

相关文章:

javascript - 在 create-react-app 项目中注销 service worker 的后果是什么?

react-native - redux saga 的延迟功能不起作用

reactjs - Redux saga 未在实时套接字上调度操作

reactjs - react JS + PDFKit

javascript - 使用 Nginx 在刷新 404 上部署后创建 React 应用程序中断

javascript - useRef() Hook 自定义组件

javascript - 如何在使用分页时重新渲染 Redux 表单

javascript - 将嵌套的 Redux 智能组件与 reducer 连接起来

javascript - 拉取api时redux中未定义数据

reactjs - 如何在 saga 异步请求后设置状态