React-redux 创建数组时重新渲染

2023-12-23

我有一个连接的组件,我想在其中检索对象数组。在我的商店中,有一个 id 数组和一个用于保存项目的对象,如下所示:

const state = {
  items: [0, 1, 2],
  itemsById: {
    0: {},
    1: {},
    2: {},
  },
}

所以使用connectReact-Redux 的函数,我在组件中执行此操作以注入正确的数组:

const mapStateToProps = (state) => ({
  items: state.items.map((itemId) => state.itemsById[itemId]),
})

我的应用程序触发更新常常(我在requestAnimationFrame),但是items在此过程中数组不会发生变化。通过使用 React Perf 插件分析应用程序,我的连接组件似乎进行了不必要的渲染,我不明白为什么,因为items状态不变。

我已经尝试使用重新选择来创建一个记忆选择器,但它似乎没有改变任何东西。

更新(解决方案)

当您使用通过重新选择创建的选择器时,它会起作用。我的问题出在选择器本身:我的items数组位于一个更新非常频繁的父对象中,我选择了这个对象而不是选择items直接数组。

不要这样做:

const parentSelector = (state) => state.parent
const itemsByIdSelector = (state) => state.itemsById
const selector = createSelector(
  parentSelector,
  itemsByIdSelector,
  (parent, itemsById) => parent.items.map(...)
)

Do this:

const itemsSelector = (state) => state.items
const itemsByIdSelector = (state) => state.itemsById
const selector = createSelector(
  itemsSelector,
  itemsByIdSelector,
  (items, itemsById) => items.map(...)
)

每次调用 connect 时都会创建一个新数组,方法如下:

const mapStateToProps = (state) => ({
  items: state.items.map((itemId) => state.itemsById[itemId]),
})

为了防止这种情况,请使用记忆选择器 http://redux.js.org/docs/recipes/ComputingDerivedData.html,每次都会返回相同的数组,除非确实发生了变化。选择器是一种计算状态派生数据的方法。Reselect https://github.com/reactjs/reselect是一个用于 redux 的记忆选择器库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React-redux 创建数组时重新渲染 的相关文章

  • 如何让react中所有可折叠项默认打开?

    我使用reactstrap制作了一个带有令牌的可折叠按钮 并且按钮单击折叠一切正常 我希望保持这种情况 但另一方面 我如何修改它以使所有可折叠按钮在页面初始渲染时打开 访问页面时 所有令牌都需要可见 这意味着所有可折叠项目都需要打开 如果我
  • Material UI 嵌套主题提供程序打破了 withStyles HOC

    我有一个使用 Create React App 创建的 React 应用程序 并使用 material ui core npm 包进行主题化 为了自定义组件 我使用 MaterialUI 提供的 withStyles 高阶组件 根据文档它支
  • 将 props 传递给每个组件

    我正在类内部通过 React Router 渲染一堆路由 我需要组件能够访问正在触发渲染的类的实例 因为它将包含服务工厂的实例等 但是 我找不到任何有关将 props 传递到通过 React Router 渲染的组件的信息 或者对我来说更有
  • 无法在 _app.js 中使用 getStaticProps

    我正在使用 next js 并尝试执行以下操作 获取 app js中与用户数据相关的基本数据 该数据包括标题 用于导航栏 和一些社交链接 用于页脚 在构建时将该数据传递给其他组件 例如页脚和导航栏 用于静态站点生成 为此我已经导出了getS
  • 创建可以传递参数而无需创建新组件的函数

    我的问题与这个问题有关React用于渲染函数中的绑定函数 以下不是好的做法 render div 因为每次重新渲染都会向页面添加一个新功能 最终导致浏览器内存不足 解决方案是这样做 constructor this callFunction
  • Reactjs 这是使用更改处理程序的更好方法

    所以我知道有几种方法可以做到这一点 但我想知道哪种方法是更好或更合适的方法来创建搜索栏组件 您能解释一下原因吗 我是新手 看过教程 但每个人对处理程序的更改都略有不同 state term onChange this onChange bi
  • Angular 6 HttpClient - CORS 问题

    我的 Nodejs Restful 服务有以下端点http localhost 3000 api countries http localhost 3000 api countries 我正在使用这个中间件https github com
  • 如何在没有 create-react-app 的情况下手动配置 React 的最小设置?

    我不想使用create react app 那么我该如何配置minimal一个简单的反应应用程序的工作开发环境 Note 我知道我可能会包含所有内容在运行时作为 JS https reactjs org docs add react to
  • 我的 React 项目中 Firestore 数据库的读取次数非常多

    我正在使用 React 和 firebase firestore 制作一个简单的 CRUD 应用程序 我目前有一组 产品 有四条记录 主页循环显示产品 import React useEffect useState from react i
  • 在辅助方法中 React i18next useTranslation Hook

    我正在使用 React 和react i18next 我的 index tsx 文件包含一些组件 我可以在那里使用翻译功能 index js import React Suspense from react import ReactDOM
  • React/React Hooks:用于更改文本的 onChange 函数同时更改所有 3 个元素,而不是仅更改一个

    我有一个组件 使用反应钩子来更改样式折叠 手风琴面板的文本 每当用户单击打开它时 我遇到的问题是这个逻辑同时影响所有 3 个折叠面板的文本 而不仅仅是打开的面板 我已经包含了一个代码沙箱的链接来突出显示该行为 并且我已经包含了下面的代码 C
  • 使用 React 前端的 Django Google 登录

    这个问题可能非常简单 但我已经搜索了一段时间 但还没有找到确切的解决方案 我正在尝试使用 React 作为前端 使用 Django 作为后端来实现 Google Login 我到底该怎么做呢 我见过一些解决方案 其中将令牌发送到后端 然后后
  • 在 socket.on() 的回调上调度操作

    所以基本上我得到了这个套接字 它工作正常 向我发送 新订单 消息 我正在使用 redux 并且我想分派一个操作 然后减速器会得到它并且我的商店将会更新 但这段代码没有做任何事情 socket on new order order gt re
  • 如何调用在 useEffect 中返回值的自定义钩子?

    我有一个自定义钩子 它通过它获取的参数返回一个对象 我需要使用任何更新的参数重新创建它 所以我需要在内部执行此操作useEffect但我无法调用 useEffect 中的钩子 知道如何实施吗 自定义钩子 useBuilder tsx exp
  • axios 拦截器内的 useContext

    我不明白为什么我的 useContext 没有在这个函数中被调用 import useContext from react import MyContext from contexts MyContext js import axios f
  • npm install --legacy-peer-deps 到底做了什么?何时推荐/潜在的用例是什么?

    刚刚遇到这个错误 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resolving email
  • 如何重载材质 Switch 组件 css

    我正在尝试重载 MuiSwitch track 类开关 但它不起作用 基本上我想重载特定开关 我尝试使用 global MuiSwitch track backgroundColor d80c0a 但它使所有开关超载 有什么办法可以对单个开
  • 使用useReducer时如何避免耦合?

    为了防止将回调传递给我正在使用的子组件useReducer反而 这避免了子组件在每个父渲染上重新渲染的问题 但缺点似乎是父组件和子组件之间的紧密耦合 通过紧密耦合 我的意思是子级需要明确了解父级定义的减速器所期望的操作的形状 例如 想象一个
  • 如何在 redux-toolkit 中正确使用 PayloadAction 和元类型?

    简化示例 import createSlice PayloadAction from reduxjs toolkit type Cake flavor string size S M L const initialState all Cak
  • 查找数组中是否有任何项目符合条件

    我是 JavaScript 新手 现在 我有一个包含多个对象的数组 因此 我想迭代它 如果任何对象与条件匹配 那么我想返回一个值并停止该循环 我的 obj 数组就像 var obj type numberOfQuestions techno

随机推荐