javascript - 在 Redux 的 Todo List 例子中真的需要 Reselect 吗?

标签 javascript reactjs redux reselect

我正在寻找提高我的 React 应用程序性能的方法。经过一番搜索后,我查看了 Reselect。但我不确定 example 是怎样的有效。

在示例中,它指出每次组件更新时都会计算 todos,这会影响性能。所以引入了memoized selector的使用来克服它。

如果我把getVisibleTodos放在组件的render函数里会有什么不同吗?我想做的是:

容器/VisibleTodoList.js

import React from 'react'
import { connect } from 'react-redux'
import { toggleTodo } from '../actions'
import TodoList from '../components/TodoList'

const getVisibleTodos = (todos, filter) => {
  switch (filter) {
    case 'SHOW_ALL':
      return todos
    case 'SHOW_COMPLETED':
      return todos.filter(t => t.completed)
    case 'SHOW_ACTIVE':
      return todos.filter(t => !t.completed)
  }
}

/*const mapStateToProps = (state) => {
  return {
    todos: getVisibleTodos(state.todos, state.visibilityFilter)
  }
}*/

const mapStateToProps = (state) => {
  return {
    todos: state.todos,
    visibilityFilter: state.visibilityFilter
}

const mapDispatchToProps = (dispatch) => {
  return {
    onTodoClick: (id) => {
      dispatch(toggleTodo(id))
    }
  }
}

const VisibleTodoList = ({todos, visibilityFilter, ...props}) => {
  const visibleTodos = getVisibleTodos(todos, visibilityFilter);
  return (
    <TodoList todos={visibleTodos} {...props} />
  )
}

const ConnectedVisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(VisibleTodoList)

export default ConnectedVisibleTodoList

在这种情况下,除非 todosvisibilityFilter 发生变化,否则不会调用 getVisibleTodos。正确的?我的修改和选择器做的一样吗?我错过了什么吗?

最佳答案

不,getVisibleTodos 仍将被调用,并在 VisibleTodoList 重新呈现时重新计算。

<删除> 此外,由于 `VisibleTodoList` 是一个函数式组件,每次当它的父组件有更新时,它都会重新渲染。 所以不,您的代码和 Reselect 的行为不同。我猜你想要的是一个类组件,然后添加 shouldComponentUpdate 手动比较 todos 和 visibilityFilter ,这样就可以避免不必要的计算。


VisibleTodoList被react-redux的connect包裹,react-redux已经为你提供了一个shouldComponentUpdate

但即使你使用shouldComponentUpdateconnect,它仍然没有Reselect那么优化。因为当您在 All、Active 或 Completed 选项卡之间切换时,getVisibleTodos 将被调用,并且会有很多重复的重新计算。 (reselect缓存了这些结果,所以没有重复的重新计算)

关于javascript - 在 Redux 的 Todo List 例子中真的需要 Reselect 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42967052/

相关文章:

javascript - SetState 和 PreviousState 的时序问题

redux - 路径 'emailReducer.emails.0' 中的错误 : Invariant failed: A state mutation was detected between dispatches,

javascript - 异步功能后强制 React 组件更新?

javascript - 如何将响应与 postman 测试用例中的值进行比较

javascript - Ajax jquery Post 没有发送参数

javascript - 在 React 中将事件传播到子组件

javascript - 重新选择不会正确内存同一组件的多个实例

javascript - 图表未创建

javascript - 从网址正则表达式中排除电子邮件地址

javascript - react 16 : Call children's function from parent when using hooks and functional component