Итак, у нас есть селектор, который получает состояние для нашего VisibleTodoList
компонента:
const mapStateToProps = (state, props) => {
return {
todos: getVisibleTodos(state, props)
}
}
Если мы отрендерим компонент:
return (
<div>
<VisibleTodoList listId="1" />
</div>
)
Затем селектор будет вызываться так: getVisibleTodos(state, { listId: 1 })
, и селектор сохраняет (запоминает) результат (объект списка задач 1) в памяти.
Если мы визуализируем компонент дважды с одинаковыми реквизитами:
return (
<div>
<VisibleTodoList listId="1" />
<VisibleTodoList listId="1" />
</div>
)
селектор вызывается и результат запоминается
селектор вызывается во второй раз, и он видит, что { listId: 1 }
- это те же аргументы проп, что и в первый раз, поэтомупросто возвращает запомненное значение.
Если мы дважды визуализируем компонент с разными реквизитами:
return (
<div>
<VisibleTodoList listId="1" />
<VisibleTodoList listId="2" />
</div>
)
, вызывается селектор, и результатзапоминается
селектор вызывается второй раз, и он видит, что { listId: 2 }
- это не те же аргументы, что и в первый раз { listId: 1 }
, поэтому он пересчитывает и запоминает новоерезультат (список задач 2 объекта) в памяти (перезаписывая предыдущий мемоизатion).
Если мы хотим, чтобы каждый компонент получал свою собственную памятку, каждый экземпляр компонента должен иметь свой собственный экземпляр селектора.
Например:
// selector
const makeGetVisibleTodos = () => createSelector(
// ... get the visible todos
);
// each has their own memoization space:
const foo = makeGetVisibleTodos(); // this is an instance
const bar = makeGetVisibleTodos(); // this is a separate instance
Таким образом, применяя его к компоненту:
// component
const mapStateToProps = () => {
const getVisibleTodos = makeGetVisibleTodos(); // this instance get bound to the component instance
return (state, props) => {
return {
todos: getVisibleTodos(state, props)
}
}
}
Теперь, если мы визуализируем компонент дважды с разными реквизитами:
return (
<div>
<VisibleTodoList listId="1" />
<VisibleTodoList listId="2" />
</div>
)
с <VisibleTodoList listId="1" />
вызывается первый экземпляр селектора, и результат запоминается
с <VisibleTodoList listId="2" />
вызывается другой экземпляр селектора, и результат запоминается