简体   繁体   English

在重新选择 Reactjs 中最小化 createSelector 的参数

[英]Minimize parameters for createSelector in reselect Reactjs

I am using reselect in my ReactJs code.我在我的 ReactJs 代码中使用了重新选择。 Here is the code snippet.这是代码片段。 Due to large file, i am ommitting out unnecessary code from it.由于文件大,我从中省略了不必要的代码。

import { createSelector } from 'reselect';

const todoSelector = state => state.todo.todos;
const searchTermSelector = state => state.todo.searchTerm;
const searchViewSelector = state => state.todo.userView

export const filteredTodos = createSelector(
  [todoSelector, searchTermSelector, searchViewSelector],
  (todos, searchTerm, searchView) => {
    return todos.filter(todo => todo.title.match(new RegExp(searchTerm, 'i')));
  }
);

As you can notice the paramters for createSelector .您可以注意到createSelector的参数。 As we know createSelector expects 2 arguments: an array of input selector(s) as the 1st argument and a function as the 2nd argument我们知道createSelector需要 2 个 arguments:输入选择器数组作为第一个参数,function 作为第二个参数

In this case, array of input selectors is 3. ( [todoSelector, searchTermSelector, searchViewSelector] )在这种情况下,输入选择器数组为 3。( [todoSelector, searchTermSelector, searchViewSelector]

But in my actual code, array of input selectors are 9. I need to reduce the count from 9 to less than 4 due to sonar issues.但在我的实际代码中,输入选择器数组是 9。由于声纳问题,我需要将计数从 9 减少到小于 4。

How can i minimize the array of input selectors and still make it work as expected.如何最小化输入选择器数组并使其按预期工作。 I search a lot online but i didnt find any ifno related to it.我在网上搜索了很多,但我没有找到任何与之相关的 ifno。 Please any suggestions?请问有什么建议吗?

If you want to reduce the number of arguments per selector functions, you can separate logic into multiple pieces and use createSelector function result as an argument for another createSelector function.如果您想减少每个选择器函数的 arguments 的数量,您可以将逻辑分成多个部分并使用 createSelector function 结果作为另一个 createSelector function 的参数。 Something like this:像这样的东西:

const todoSelector = state => state.todo.todos;
const searchTermSelector = state => state.todo.searchTerm;
const searchViewSelector = state => state.todo.userView

export const filteredTodosByTerm = createSelector(
  [todoSelector, searchTermSelector],
  (todos, searchTerm) => {
    return todos.filter(todo => todo.title.match(new RegExp(searchTerm, 'i')));
  }
);

export const filteredTodosByView = createSelector(
  [filteredTodosByTerm, searchViewSelector],
  (todos, searchView) => {
    return todos.filter(todo => todo.title.match(new RegExp(searchView, 'i')));
  }
);
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM