Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 调用redux saga中的组合重选选择器_Reactjs_Redux_Redux Saga_Reselect - Fatal编程技术网

Reactjs 调用redux saga中的组合重选选择器

Reactjs 调用redux saga中的组合重选选择器,reactjs,redux,redux-saga,reselect,Reactjs,Redux,Redux Saga,Reselect,我正试图从redux saga调用一个组合选择器。我的想法是我有两个下拉列表。第一个下拉列表中的选项将在第二个下拉列表中过滤适当的值,即我的组合选择器将过滤掉一些不相关的值,因此它们不会显示在第二个下拉列表中: 1) 我有两个选择器,firstSelector和secondSelector // firstSelector returns {"Cat":["black","white"],"Dog":["grey"]} const firstSelector= () => create

我正试图从
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) 我在组合选择器中组合这些选项(应返回
[“黑色”、“灰色”]
,即过滤掉“白色”)

3) 但是我如何调用
redux saga
中的
filterBySelection
? 我试过:

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

但这些方法不起作用

不过,我可以调用
firstSelector
secondSelector
,即:

const firstData= yield select(firstSelector());
有人会说,在redux传奇中,我可以简单地做到以下几点:

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传奇中是否可以使用记忆选择器呢


致以最诚挚的问候

您似乎没有调用函数返回选择器。因此,要么:

(a)

c) 定义
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);
    },
  );```

我认为您可以在createSelector中删除数组,只需将子选择器作为参数传递
constFilterBySelection=(firstSelector,secondSelector)=>createSelector(firstSelector,secondSelector,(first,second)=>{constFilteredValues=Object.keys(first)。reduce((r,k)=>r.concat(first[k]),[],返回second.filter(val=>filteredValues.indexOf(val)>=0);},)这正是我的选择器。这不是问题/问题。我是说,你应该删除数组,删除数组时,你不需要使用括号()谢谢!我觉得这很有帮助。我将一个单独的选择器组合到主选择器中,一切正常。在单独的选择器导致问题之前(搜索词过滤以及单独的无线电过滤器)。正确。。。我错过了呼叫组合选择器中的选择器:P谢谢!
const firstData= yield select(firstSelector());
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,
);
const filterBySelection = (firstSelector, secondSelector) =>
  createSelector(
    [
       firstSelector(), // <- parentheses 
       secondSelector(), // <- parentheses 
     ], ... )
const filteredValues = yield select(
  filterBySelection(firstSelector(), secondSelector())
);
const firstSelector = 
  createSelector(selectPage, substate => substate.firstDropDown);

const secondSelector = 
  createSelector(selectPage, substate => substate.secondDropDown);
const filteredValues = yield select(
  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);
    },
  );```