Я использую React / Redux / Reselect.
Из повторно выберите doc , если у меня есть несколько компонентов, которые будут использовать селектор с разными параметрами, мне нужно создать его для каждого экземпляра.
const makeGetVisibleTodos = () => {
return createSelector(
[
(state, props) => props.visibilityFilter,
state => state.todos,
],
(visibilityFilter, todos) => {
return todos.filter(td => td.visibility === visibilityFilter)
}
}
)
}
Но в моем случае listId
может происходить из нескольких источников (например, props.listId
, props.location.match.listId
, props.location.search.listId
и т. Д.)
Так что я чувствую себя болеенапример, написать следующее:
const makeGetVisibleTodos = listId => {
return createSelector(
[
state => state.todos,
],
(todos) => {
todos.filter(td => td.listId === listId)
}
}
)
}
и подключить его следующим образом:
connect(
(state, ownProps) => ({
offerer: makeGetVisibleTodos(ownProps.location.match.listId)(state, ownProps),
}),
)
Я почти уверен, что это работает, но я не уверен на 100%, что это запомнит правильно:
Если два компонента вызывают makeGetVisibleTodos
с одинаковым listId
, у них будет 2 разных значения кэша, верно?Что не то, что я хочу ...
Как насчет этого?
const makeGetVisibleTodos = listId => {
return createSelector(
state => state.todos,
state => listId,
(todos, listId) => {
todos.filter(td => td.listId === listId)
}
}
)
}
В этом случае makeGetVisibleTodos(ownProps.listId)
и makeGetVisibleTodos(ownProps.match.params.listId)
совместно используют одно и то же значение кэша, когда ownProps.listId === ownProps.match.params.listId
?
Или еще один способ сформулировать вопрос: как передать дополнительные параметры, которые (напрямую) не зависят от state
и ownProps
, но проверяются на равенство при запоминании?
Я мог бы также расширить ownProps
:
connect(
(state, ownProps) => ({
offerer: makeGetVisibleTodos()(state, Object.assign({}, ownProps, {listId: ownProps.location.match.listId}),
}),
)
Но нахожу это очень безобразным, и оно теряет смысл ...