Определение слайдеров сброса для запоминания в нескольких экземплярах компонентов

#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 при каждом запуске.

Ключ к правильному использованию запоминаемых селекторов:

  • Повторное использование одного и того же экземпляра селектора несколько раз
  • И продолжайте передавать ему те же аргументы

Если вы создаете новый экземпляр селектора, у него нет кэшированных значений. Если у вас один и тот же экземпляр, но при каждом вызове вы передаете ему разные значения, то запоминание никогда не работает.

Для получения более подробной информации см. Мой пост С использованием селекторов повторного выбора для инкапсуляции и производительности.