Redux 中使用 Selector 技巧

Redux 中使用 Selector 技巧

在 Redux 应用程序中使用 Selector 可以让代码更加高效、可读性更强。Selector 本质上是一个纯函数,负责将存储于 Redux store 中的 state 转换成渲染视图所需的数据结构。在使用 Selector 时,需要考虑一些技巧和最佳实践,本文将对这些问题进行详细讲解和指导。

一、避免对完整 state 树执行计算 在 Redux 中,selector 不应该对完整的 state 树执行计算,而应该只关注它所依赖的那一部分 state。这是因为 Redux Store 中包含的 state 树可能非常大,而且可能包含许多嵌套的子对象。如果每次调用 Selector 都执行完整的计算,会导致性能问题。 因此需要注意选择使用state的哪一部分进行计算。

二、使用 reselect 库增加性能 Reselect 是一个小型且高效的库,它最大化了 Selector 的性能,并允许我们避免不必要的计算。Reselect 库可以记忆 Selector 的结果,只在其依赖的 state 有变化时进行重新计算,以避免不必要的计算和大量的结果缓存。

三、Selector 返回值应该是纯的数据结构 Selector 函数的返回值应该是一个简单的、不可变的 JavaScript 数据结构,这样可以最大限度地提高性能和可读性。返回的对象应该尽可能少地依赖于 state 数据,已经通过前面的计算过程将 state 转换成 UI 组件所需要的数据结构。常见的返回数据可为普通的对象,数组等。

四、大维度的 Selector 可以通过组合实现 Selector 可以通过组合来实现大维度的 state tree 的数据获取。组合的方式可以使用 reselect 提供的 createSelector 函数来实现。例如:

------ - -------------- - ---- -----------

----- ------- - ------- -- -----------------
----- --------- - ------- ------ -- -------------

------ ----- ---------- - ---------------
  --------- -----------
  ----------- ------- -- ------------------
--

五、Selector 应该根据需要可以接受 props 在某些情况下,我们需要基于组件的 props 属性对 state 进行过滤,比如说被选中的用户的 ID。在这种情况下,我们需要在 Selector 中传入 props 参数,以便作为参数使用。

举个例子,假设我们的 redux store 包含一个 users 对象,每个用户有一个 id、 name 和 email 属性。让我们先定义一个简单的 Selector 用来选择属于当前用户的用户信息:

------ - -------------- - ---- -----------

----- -------- - ------- -- -----------------
----- ---------------- - ------- ------ -- -------------

------ ----- ----------------- - ---------------
  ---------- ------------------
  ------- ------- -- --------------
--

这个 Selector 接收 state 和组件属性作为参数,并将它们结合在一起以返回所需的用户信息。

六、使用 memoization 和 reselect 优化代码

Selector 是可以重复使用的,它将为同一组组件渲染生成相同的结果。通过合理使用 memoization 和 reselect,可以减少获取 state 并生成结果的次数,从而通过提高性能、减少代码和可维护性来优化代码。

举个例子,如果我们有一个组件需要使用每一位用户的姓氏,我们可以如下定义 Selector:

------ - -------------- - ---- -----------

----- -------- - ------- -- -----------------

------ ----- -------------- - ---------------
  ---------
  ------- -- ---------------- -- --------------
--

这个例子中,getUsers 函数是非负载 Selector。这意味着对于同一个状态树部分,我们会对该函数多次执行。但是,在使用 reselect 和 memoize 时,每个用户的名称只需要在初始渲染时进行一次计算,然后将其缓存起来,就可以避免多次计算。

七、Selector 的最佳实践

  1. Selector 应该返回一个函数。

  2. Selector 不能修改 state,否则会导致意外和难以诊断的错误。

  3. Selector 应该保持简单和可组合,并努力与组件库保持一致。

  4. Selector 应该返回尽可能少的内容,这可以通过使用适当的转换来实现。

  5. Selector 应该只依赖于它所依赖的 state 的子集。

  6. Selector 应该避免使用默认参数,因为这会导致在缓存中使用重复的值。

  7. Selector 应该只在组件嵌套深度超过两个时保留使用。

八、总结 在 Redux 应用中,使用 Selector 可以使代码更高效、可读性更强。我们可以通过 reselect 库和 memoization 来提高性能,并根据需要接受组件的属性。然而,我们需要遵循一些最佳实践,例如避免对 complete state tree 进行计算和保持 Selector 的简单性和可组合性。同时,我们还需要遵循合适的实践,以便提高代码可维护性和可读性。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64748336968c7c53b01de843


猜你喜欢

  • 使用 jsdom、mocha、sinon 和 chai 建立一个 node 单元测试套件 (二) —— 测试前端脚本

    前言 在本篇文章中,我们将探讨如何使用 jsdom、mocha、sinon 和 chai,来建立一个可以测试前端脚本的单元测试套件。 在前一篇文章中,我们已经详细介绍了如何使用这些工具来测试纯 Jav...

    1 年前
  • Angular 如何处理跨域请求(CORS)并避免报错

    什么是跨域请求 在 Web 开发中,跨域请求指的是浏览器客户端向不同源(协议、域名、端口任一不同)的服务器发送请求。跨域请求是一种常见的 Web 应用程序需求,例如在前端应用程序中调用第三方 API ...

    1 年前
  • 让 Fastify 应用支持 WebSocket 的方法

    介绍 Fastify 是 Node.js 中一款快速的 Web 框架,它专门为构建高效的 REST APIs 和微服务而设计。在实际开发中,我们经常会需要实现实时通信,而 WebSocket 是一种比...

    1 年前
  • ECMAScript 2019 (ES10) 的所有新特性总结

    随着前端技术的不断发展,ECMAScript 2019 (ES10) 带来了一些新的特性。在这篇文章中,我们将对这些新特性进行详细的总结,以及演示它们的使用和指导意义。

    1 年前
  • 在 Jest 测试环境下如何读取图片资源

    介绍 在前端开发过程中,图片资源的使用是不可或缺的一部分。在测试过程中,有时我们需要读取图片资源,例如测试图片是否加载成功等。但是在 Jest 测试环境下,由于 Node.js 环境中没有原生的图片操...

    1 年前
  • 如何使用 React 实现全局状态管理

    在 React 开发中,状态管理是非常重要的一部分。如果项目过于复杂,不适当地处理状态很容易导致代码混乱、维护困难。因此,学会如何使用 React 实现全局状态管理是一项必不可少的技能。

    1 年前
  • 大数据分析中的性能优化方法

    在大数据分析领域,对于海量数据的处理和分析往往需要消耗大量的计算资源和时间。因此,如何进行性能优化成为了一个非常关键的问题。本文将介绍在大数据分析中常用的性能优化方法,以及其背后的原理和实现方式。

    1 年前
  • 如何使用 Mongoose 进行表关联

    如何使用 Mongoose 进行表关联 Mongoose 是基于 MongoDB 的 Node.js 框架,使我们能够在 Node.js 中定义并操作 MongoDB 模型。

    1 年前
  • ES9 中装饰器的使用及其打包问题解决方法

    装饰器是一种能够修改或增强类或类方法的特殊语法结构。在 ES9 规范中,装饰器成为了一个正式的语言特性,为开发者提供了更加便利和灵活的代码实现方式。本文将详细介绍 ES9 中装饰器的使用及其打包问题解...

    1 年前
  • LESS 与 Gulp 结合的自动化工作流程

    在前端开发中,我们常常需要编写 CSS 样式表,而 LESS 是一种基于 CSS 的 CSS 预处理器,可以让我们使用类似编程语言的方式来编写 CSS 代码,比如变量、混合、函数等,从而让 CSS 开...

    1 年前
  • 如何使用 Node.js 创建定时任务

    如何使用 Node.js 创建定时任务 在前端开发中,我们经常需要处理一些定时任务,例如定时爬取数据、定时发送邮件等。使用 Node.js 可以帮助我们快速创建定时任务,并且具有较高的灵活性和可定制性...

    1 年前
  • Sass 函数入门及常用函数整理

    前言 在前端开发中,我们常常需要用到 CSS 来设置样式。然而,CSS 语法比较繁琐,尤其在处理复杂样式时需要大量的重复代码和冗余样式,对于开发效率和代码维护都带来不小的问题。

    1 年前
  • 在线游戏开发必备技术:Socket.io 实现长连接通信

    在在线游戏的开发过程中,实现长连接通信是必不可少的一部分。而 Socket.io 这个开源的 JavaScript 库可以帮助我们轻松地实现这一目标。本文将介绍 Socket.io 的使用、原理和实现...

    1 年前
  • 使用 Mocha 和 Chai 测试 HTML5 canvas 元素

    HTML5 canvas 元素给前端开发者提供了创建和绘制图形的强大工具。随着 canvas 在各个网页中的应用变得越来越普遍,确保其功能和交互的稳定性变得愈发重要。

    1 年前
  • CSS Grid 中网格项目的对齐布局方式详解

    CSS Grid 是一种强大的布局方式,它可以让我们在网页设计中实现复杂的布局效果。在 CSS Grid 中,网格项目的对齐布局方式非常重要,它可以决定网格项目在网格容器中的位置以及大小。

    1 年前
  • RESTful API 的构建块

    RESTful API 是一种广泛应用于互联网的 API 设计规范。它通过 HTTP 协议提供资源的标准接口,强调标准化、简洁、可扩展和面向资源的设计理念,成为越来越多 Web 开发者的首选。

    1 年前
  • MongoDB 在大数据领域中的应用

    引言 在当今时代,大数据已经成为了一个越来越重要的领域。随着互联网和物联网的发展,数据量不断增长。传统的关系型数据库在处理大数据时性能不佳,而 NoSql 数据库则逐渐成为了处理大数据的重要工具。

    1 年前
  • Webpack Source Map 调试技巧

    在前端开发中,我们常常会遇到 JavaScript 的调试问题,特别是当我们使用了 webpack 打包工具时,代码混淆和压缩使得调试变得更加困难。这时,source map 就变得非常重要。

    1 年前
  • Redis 中如何监控性能及实时监控

    Redis 是一个高性能、内存数据库,它具有快速读写能力、多种数据结构、丰富的数据类型以及非常出色的扩展性。大量的应用程序,尤其是 Web 应用程序,都使用 Redis 作为其缓存层或者持久化层的数据...

    1 年前
  • 如何在 JS 中处理另一个浮点数 bug 的情况 —— 除以零

    引言 在前端开发中,我们常常需要处理数字类型的数据,其中浮点数是比较常见的一种。然而,在处理浮点数运算时,我们也会遇到一些困难,比如除以零的情况,这往往会导致程序出现 bug。

    1 年前

相关推荐

    暂无文章