为跨多个组件实例的记忆定义重置选择器
Defining reset slectors for memoization across multiple component instances
我希望使用 redux reselect
库来编写我的 react-redux 选择器。在文档中有 this section that 描述了如何编写可供多个组件实例使用的选择器。
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
该示例根本不会记忆,因为它会在每次 mapState
运行时创建一个新的选择器实例。
正确使用记忆选择器的关键是:
- 多次重复使用同一个选择器实例
- 并继续传递相同的参数
如果您创建一个新的选择器实例,它没有缓存值。如果您有相同的实例,但每次调用它时都会传递 不同的 值,那么记忆永远不会起作用。
更多详细信息,请参阅我的 post Using Reselect Selectors for Encapsulation and Performance。
我希望使用 redux reselect
库来编写我的 react-redux 选择器。在文档中有 this section that 描述了如何编写可供多个组件实例使用的选择器。
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
该示例根本不会记忆,因为它会在每次 mapState
运行时创建一个新的选择器实例。
正确使用记忆选择器的关键是:
- 多次重复使用同一个选择器实例
- 并继续传递相同的参数
如果您创建一个新的选择器实例,它没有缓存值。如果您有相同的实例,但每次调用它时都会传递 不同的 值,那么记忆永远不会起作用。
更多详细信息,请参阅我的 post Using Reselect Selectors for Encapsulation and Performance。