#javascript #reactjs #redux #reselect
#javascript #reactjs #redux #повторный выбор
Вопрос:
Я собираюсь использовать библиотеку redux reselect
для написания своих селекторов react-redux. В документации есть этот раздел , в котором описывается, как написать селекторы, которые могут использоваться несколькими экземплярами компонентов.
import { connect } from 'react-redux'
import { toggleTodo } from '../actions'
import TodoList from '../components/TodoList'
import { makeGetVisibleTodos } from '../selectors'
const makeMapStateToProps = () => {
const getVisibleTodos = makeGetVisibleTodos() // here
const mapStateToProps = (state, props) => {
return {
todos: getVisibleTodos(state, props)
}
}
return mapStateToProps
}
const mapDispatchToProps = (dispatch) => {
return {
onTodoClick: (id) => {
dispatch(toggleTodo(id))
}
}
}
const VisibleTodoList = connect(
makeMapStateToProps,
mapDispatchToProps
)(TodoList)
export default VisibleTodoList
Мне интересно, влияют ли различия в том, как вызывается селектор makeGetVisibleTodos (как показано ниже), на то, как работает запоминание. будет ли по-прежнему работать запоминание?, если нет, то почему?
import { connect } from 'react-redux'
import { toggleTodo } from '../actions'
import TodoList from '../components/TodoList'
import { makeGetVisibleTodos } from '../selectors'
const makeMapStateToProps = () => {
const mapStateToProps = (state, props) => {
return {
todos: makeGetVisibleTodos()(state, props) // and here
}
}
return mapStateToProps
}
const mapDispatchToProps = (dispatch) => {
return {
onTodoClick: (id) => {
dispatch(toggleTodo(id))
}
}
}
const VisibleTodoList = connect(
makeMapStateToProps,
mapDispatchToProps
)(TodoList)
export default VisibleTodoList
Комментарии:
1. Конечно, интересный вопрос. И затем это: » будет ли это по-прежнему работать?, если нет, то почему? » — у вас есть весь код, кажется, у вас будет все, что вам нужно, чтобы ответить на ваш собственный вопрос. Чего мне не хватает?
2. извините, вероятно, языковое ограничение, я хотел спросить, будет ли работать сама часть запоминания, а не код. @RandyCasburn
Ответ №1:
Этот пример никогда не будет запоминаться вообще, потому что он создает новый экземпляр селектора mapState
при каждом запуске.
Ключ к правильному использованию запоминаемых селекторов:
- Повторное использование одного и того же экземпляра селектора несколько раз
- И продолжайте передавать ему те же аргументы
Если вы создаете новый экземпляр селектора, у него нет кэшированных значений. Если у вас один и тот же экземпляр, но при каждом вызове вы передаете ему разные значения, то запоминание никогда не работает.
Для получения более подробной информации см. Мой пост С использованием селекторов повторного выбора для инкапсуляции и производительности.