Документация React-Redux предоставляет этот пример , когда селектор используется в нескольких экземплярах компонента и зависит от свойств компонента.
import React, { useMemo } from 'react'
import { useSelector } from 'react-redux'
import { createSelector } from 'reselect'
const makeNumOfTodosWithIsDoneSelector = () =>
createSelector(
state => state.todos,
(_, isDone) => isDone,
(todos, isDone) => todos.filter(todo => todo.isDone === isDone).length
)
export const TodoCounterForIsDoneValue = ({ isDone }) => {
const selectNumOfTodosWithIsDone = useMemo(
makeNumOfTodosWithIsDoneSelector,
[]
)
const numOfTodosWithIsDoneValue = useSelector(state =>
selectNumOfTodosWithIsDone(state, isDone)
)
return <div>{numOfTodosWithIsDoneValue}</div>
}
export const App = () => {
return (
<>
<span>Number of done todos:</span>
<TodoCounterForIsDoneValue isDone={true} />
<span>Number of unfinished todos:</span>
<TodoCounterForIsDoneValue isDone={false} />
</>
)
}
Почему в функции TodoCounterForIsDoneValue
автор помещает makeNumOfTodosWithIsDoneSelector
в useMemo
? Насколько я понимаю, createSelector
из reselect
состоит в том, что он генерирует мемоизированный селектор, так какова цель «двойного» запоминания этого селектора?