从 React 谈前端状态管理

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

前端状态管理是一项重要的工作,而 React 是一种非常流行的前端框架,因此许多开发人员使用它来处理状态管理。本文将介绍 React 的状态管理实践,为您提供详细的指导和示例代码。

状态管理概述

前端应用程序的状态通常是指应用程序中的所有数据和状态,包括用户输入、活动状态和服务器响应等。在传统的 Web 开发中,状态通常通过全局变量或后端存储实现。但随着单页应用程序成为主流,前端状态管理逐渐变得复杂且需要专门的解决方案。React 的状态管理理念主要包含两个方面:

  1. 让状态被集中管理

  2. 让状态被单向流动

状态集中管理

React 推崇所有状态都集中存在一个地方,从而更容易查找和调试问题。在 React 中,状态通常存储在组件的 state 属性中。您可以根据需要在顶层组件(如 App 或页面级别组件)中保存应用程序级别状态,或在每个组件中保存更小的、专有的状态。

单向数据流

React 还鼓励开发人员将数据的流动设置为单向。这意味着在组件之间传递数据和状态时,只能以一种预定义的方向进行。更具体地说,状态从父组件流向子组件,而不是反向。子组件可以更改这些状态,但无法影响同一级别的另一个子组件或父组件中的状态。这种模式有助于降低代码中的复杂度、减少不必要的组件通信和传递数据的混淆。

状态管理实践

React 提供了状态管理的解决方案,开发者可以使用、组合和编写自己的一些库,称之为状态管理工具。

Context API

Context API 是 React 官方提供的一组 API,可使开发人员将状态从上层组件传递到下层组件,无需手动传递它们。通过创建一个新的 Context 对象并将其导出,您可以将状态从父组件传递给子组件。下面是一个小例子:

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

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

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

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

您可以在任何层级的组件中使用该 Context 对象,这将使数据流动更具灵活性。

Redux

Redux 是一种流行的状态管理库,是基于纯粹的 JS 数据模式和模块化思路来简化状态管理的。它每一个 应用的状态保存在一个单一的 JavaScript 对象中。更新状态时,需要按照提前的规则对状态进行处理。与 React 的 Context API 不同,Redux 通常在全局存储组件的状态,因此您无需担心跨组件状态传递的开销问题。Redux 通过单独的“store”保存状态,同时使用实时数据流更新它。这个 store 管理所有状态的集中存储,该状态可以通过组件事件修改。以下是一个简单的 Redux 示例代码:

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

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

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

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

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

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

在上面的代码中,我们创建了一个新的 store,该 store 对象包含了完整的应用程序状态,并使用“reducer”函数(也就是修改器)更新状态。我们也订阅了该 store 的更改事件。每次调用 store.dispatch(action) 时,将执行 reducer 并触发所有订阅了该 store 的更改事件。因此,您只需要执行 action 并更新状态的 reducer,即可更改整个应用程序的状态。

mobx

MobX 是一种状态管理库,它允许您使用命令式编程技术来实现响应式的数据处理。它通过 @observable、@computed、@action 等装饰器来增加应用程序状态的响应性和可维护性。通过改变任何 observable 属性,可以自动更新所有相关的 computed 属性,这使得应用程序的状态更加明确化。以下是基于 MobX 的状态管理代码:

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

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

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

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

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

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

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

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

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

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

该库带有不同的装饰器以进行快速状态管理,这是一个更为自由,但也更为具有挑战性的方法。

结论

无论您是使用 React 官方的 Context API,还是像 Redux 或 MobX 这样的第三方库进行状态管理,都需要遵循简单的模式,即将状态从顶级组件向下流动,避免出现无关的交互情况。这有助于减少应用程序中的混淆和错误,使其易于处理和剥离。在选择状态管理解决方案时,您需理解技术和相应的特点,以及团队和代码的需求。无论何时,始终保持简单和整洁的代码都更容易维护和扩展。

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


猜你喜欢

  • 如何在 Express.js 中使用 SQL 数据库?

    在 Web 开发中,使用持久化的数据存储是必不可少的。虽然 NoSQL 数据库因其高度灵活性和可扩展性而被广泛使用,但许多应用程序仍然需要使用结构化数据存储。其中,SQL 数据库作为一种广泛使用的解决...

    19 天前
  • 如何将现有 Web 应用转换为 PWA?

    随着 PWA 技术的发展,许多现有的 Web 应用程序也开始考虑将其转换为 PWA,以提供更好的体验和更好的性能。在本文中,我们将深入探讨如何将现有的 Web 应用程序转换为 PWA,以及如何在转换过...

    19 天前
  • 解决 Tailwind CSS 在 npm install 后找不到样式的问题

    如果你在安装 Tailwind CSS 后却遇到了找不到样式的问题,那么本篇文章将会指导你如何解决这个问题。 背景 Tailwind CSS 是近年来非常火爆的 CSS 框架,它通过大量的 utili...

    19 天前
  • 构建自己的 Serverless 应用:基于 API Gateway 和 Lambda 的实践

    在现代的 Web 开发中,Serverless 技术正在逐渐成为一种新的趋势。Serverless 技术可以帮助我们更加简单、高效地构建和部署应用程序,而不需要担心服务器管理和运维等问题。

    19 天前
  • 如何在 Deno 中使用 Express 框架?

    介绍 Deno 是一个新兴的 JavaScript/TypeScript 运行时环境,它可以在浏览器之外运行 JavaScript,开发者可以使用它来构建服务器端应用程序。

    19 天前
  • ECMAScript 2018 中的 BigInt 类型使用技巧

    在 ECMAScript 2018 中,BigInt 类型被引入作为一种新的 JavaScript 数据类型,用于表示大整数。BigInt 类型的存在解决了 JavaScript 中处理大整数的问题,...

    19 天前
  • 解决使用 RESTful API 请求接口时遇到的 403 错误

    背景 在使用 RESTful API 请求接口时,我们可能会遇到 403 错误,该错误通常表示请求被服务器拒绝。这是因为服务器的访问控制策略限制了您的访问权限。但是,这种错误可能是由多种原因引起的,并...

    19 天前
  • PM2 监控指标解读与调整优化

    PM2 是一个常见的 Node.js 进程管理工具,可以进行进程监控、负载均衡、故障自动重启等操作。在使用 PM2 进行 Node.js 应用部署的过程中,了解 PM2 监控指标的含义和如何调整优化非...

    19 天前
  • 响应式设计中如何解决图片加载过慢问题

    对于前端开发人员来说,响应式设计已经成为了一种标配。然而,在实现一个响应式设计的过程中,会遇到很多问题。其中,图片加载过慢问题是一个很常见的问题。解决这个问题不仅能够提升用户的体验,也能优化网站的性能...

    19 天前
  • Jest 怎么使用?Jest 入门指南

    前言 Jest 是一个 JavaScript 的测试框架,由 Facebook 开发,它可以测试 React 应用或纯 JavaScript 应用。Jest 在测试速度和简单性方面提供了极佳的体验,测...

    19 天前
  • Promise 的链式调用及其原理分析

    前言 Promise 是 JavaScript 中异步编程的一种解决方案,通过 Promise 可以更加高效地处理异步操作。在实际开发中,经常需要使用 Promise 来处理异步任务,尤其是在请求数据...

    19 天前
  • 如何习惯性地避免 ES12 中的坑点,提高编程质量?

    JavaScript 语言不断发展,并推出了 ES12 版本。ES12 给前端开发带来了许多新特性和增强功能,同时也带来了一些坑点,让前端开发者面临挑战。本文将探讨如何习惯性地避免 ES12 中的坑点...

    19 天前
  • 如何检查你的网站的无障碍性是否达标?

    作为前端工程师,我们必须考虑到所有用户的需求,包括那些有视觉和听觉障碍的用户。无障碍网站的设计考虑到所有用户,并确保网站可以访问和使用。 但是如何检查你的网站是否无障碍?本文将介绍几种常用的无障碍测试...

    19 天前
  • CSS Reset 对 SEO 的影响及优化技巧

    前言 在做网站开发时,为了解决不同浏览器之间的 CSS 样式差异问题,我们经常需要使用到 CSS Reset(又称 CSS Normalize)工具。然而,在使用 CSS Reset 时,我们需要注意...

    19 天前
  • Tailwind CSS:如何在 React 项目中用 Tailwind 创建组件?

    Tailwind CSS:如何在 React 项目中用 Tailwind 创建组件? Tailwind CSS 是一个高度可定制的 CSS 框架,它可以快速为 Web 项目提供样式和布局。

    19 天前
  • 在 Redux 中如何处理分组及合并数据

    Redux 是一个流行的 JavaScript 应用程序状态管理工具。每个 Redux 应用程序都有一个状态树,其中包含了所有的状态数据。在许多情况下,我们需要对这些数据进行分组和合并来更好地组织应用...

    19 天前
  • 如何在 Deno 中运行 shell 命令?

    介绍 Deno 是一款现代化的 JavaScript 和 TypeScript 运行时环境,它支持在命令行中运行 JavaScript、TypeScript 和 WebAssembly 程序。

    19 天前
  • CSS Grid 实现响应式图片布局的技巧

    简介 CSS Grid 是一种强大的布局工具,它可以帮助我们快速创建可移植、可复用且易于维护的响应式布局。在本文中,我们将探讨如何使用 CSS Grid 实现响应式图片布局的技巧。

    19 天前
  • Redis 中的内存问题及解决思路

    前言 Redis 是一个高性能的基于内存的键值存储系统,也是一种 NoSQL 解决方案。由于其性能卓越,现在被广泛应用于互联网公司的服务器中。但是,在使用 Redis 的过程中,我们经常会遇到内存不足...

    19 天前
  • RxJS 中的 race 操作符详解

    本文将为大家详细介绍 RxJS 中的 race 操作符。RxJS 是一种采用响应式编程思想的 JavaScript 库,它提供了一种处理异步数据流的方式。RxJS 中的 race 操作符可以帮助我们快...

    19 天前

相关推荐

    暂无文章