【发布时间】:2019-02-26 09:25:51
【问题描述】:
我正在尝试从redux-saga 调用组合选择器。这个想法是我有两个下拉菜单。第一个下拉菜单中的选择将过滤第二个下拉菜单中的适当值,即我的组合选择器将过滤掉一些不相关的值,因此它们不会显示在第二个下拉菜单中:
1) 我有两个选择器,firstSelector 和 secondSelector
// 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"],即过滤掉“白色”)
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)
);
但是这些方法都行不通。
不过,我可以打电话给firstSelector 或secondSelector,即有效:
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,
);
但那将是not memoize,这个想法是memoize。
那么是否可以在 redux-saga 中使用 memoized 选择器?
最好的问候
【问题讨论】:
-
我认为你可以在 createSelector 中删除数组,只需将 subSelector 作为参数传递
-
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); }, );
标签: reactjs redux redux-saga reselect