发布于 2026-01-06 0 阅读
0

Recoil 是 React 状态管理中的武士刀

Recoil 是 React 状态管理中的武士刀

今天,我尝试用一​​种全新的方式呈现这篇文章,融入了武士元素。我衷心希望这能为您的阅读体验增添价值。欢迎并感谢您的反馈,请在下方评论区分享您的想法。


🚨重要通知

Recoil目前缺乏更新和维护支持,这引起了社区开发者的担忧。另一方面,许多开发者喜欢使用 Recoil,并认为它是一个非常有用的状态管理库。因此,我们建议在决定是否在新项目中继续使用 Recoil 时谨慎行事。

Recoil 最近一次更新是在 2022 年 10 月 12 日。长期缺乏更新导致一些开发者转而使用其他状态管理库,这可能表明 Recoil 已不再是未来项目的可靠选择。维护人员的缺失可能意味着问题和漏洞无法得到及时解决,从而给您的应用带来麻烦。

如果您选择继续使用 Recoil,我们建议您密切关注其发展动态,并考虑其他替代方案。在为项目选择工具时,做出明智的决定至关重要,我们希望确保读者在做出决定前了解 Recoil 的现状。

请注意,此消息最后更新于2023 年 3 月 9 日,此后 Recoil 的情况可能已发生变化。

祝您编程愉快!


Recoil 的创建是为了提供Redux 的替代方案,Redux是另一个流行的 React 状态管理库。在今天的探索中,我们将了解Recoil 是什么它的工作原理为什么你可能需要在 React 应用中使用它等等。

怀着武士精神,让我们开始冒险吧……


安装后坐力——武士之道

您可以使用以下命令在终端中安装npmRecoil yarn

npm install recoil
Enter fullscreen mode Exit fullscreen mode

使用反冲状态的组件需要将RecoilRoot放在父组件树中的某个位置。一个不错的放置位置是根组件:

import React from "react";
import ReactDOM from "react-dom/client";
import { RecoilRoot } from "recoil";
import App from "./App";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  <React.StrictMode>
    <RecoilRoot>
      <App />
    </RecoilRoot>
  </React.StrictMode>
);
Enter fullscreen mode Exit fullscreen mode

这确保所有需要该状态的子组件都能访问到它,并避免因缺少RecoilRoot组件而导致组件无法访问状态的潜在问题。武士之道不容许任何差错。因此,务必保持警惕和荣誉。


什么是后坐力?

Recoil是 Facebook 于 2020 年发布的 React 状态管理库。它提供了一种简单直观的方式来管理 React 应用的状态。Recoil 构建于 React 的Context API之上,后者用于在组件树中传递数据。总而言之,与 Context API 相比,Recoil 提供了一种更强大、更灵活的应用状态管理方式。

Recoil 的核心思想是将状态定义为原子集合。原子是状态的一部分,可以被组件读取和更新。组件可以订阅原子,以便在原子值发生变化时收到通知。

Recoil 还有一个秘密武器——选择器(Selectors),这是一种强大的函数,可以从原子或其他选择器中推导出新的状态。选择器可用于根据应用程序的状态计算派生数据。

武士刀


Recoil 的工作原理是什么?

Recoil 的精髓源于武士对周遭世界的敏锐洞察。它的工作原理是定义一组原子和选择器,这些原子和选择器共同代表应用程序的状态。原子通过函数定义atom(),该函数接受一个初始值作为参数。选择器通过函数定义,selector()该函数接受一个计算派生状态的函数作为参数。原子选择器共同构成了 Recoil 的核心。

制造原子

在武士道中,Recoil 中的原子就像一把剑。它是一个状态单元,可以被应用程序的不同部分读取和写入。要创建原子,可以使用 Recoil 库中的 atom 函数。

为了让你明白我的意思……

import { atom } from 'recoil';

export const weaponState = atom({
  key: 'weaponState',
  default: {
    name: 'Katana',
    damage: 50,
  },
});
Enter fullscreen mode Exit fullscreen mode

在组件中使用原子

组件可以订阅原子选择器
weaponState在组件中使用原子,可以使用useRecoilStateRecoil 库中的钩子。

为了让你明白我的意思……

import React from 'react';
import { useRecoilState } from 'recoil';
import { weaponState } from './atoms';

function WeaponDisplay() {
  const [weapon, setWeapon] = useRecoilState(weaponState);

  return (
    <div>
      <h1>{weapon.name}</h1>
      <p>Damage: {weapon.damage}</p>
      <button onClick={() => setWeapon({ name: 'Nodachi', damage: 70 })}>
        Upgrade Weapon
      </button>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

如上例所示,我们使用useRecoilState钩子来访问weaponState原子及其当前值。我们还提供了一个按钮,允许用户通过将原子设置为新值来升级武器。

创建选择器

选择器是允许您从Recoil 原子中导出状态的函数。它们可用于计算复杂值或聚合来自多个原子的数据。

为了让你明白我的意思……

import { selector } from 'recoil';
import { weaponState } from './atoms';

export const weaponDamageSelector = selector({
  key: 'weaponDamageSelector',
  get: ({ get }) => {
    const weapon = get(weaponState);
    return weapon.damage;
  },
});
Enter fullscreen mode Exit fullscreen mode

在组件中使用选择器

然后,我们可以像使用原子一样,在组件中使用hook 来使用选择器useRecoilValue

为了让你明白我的意思……

import React from 'react';
import { useRecoilState } from 'recoil';
import { weaponDamageSelector } from './selectors';

function WeaponDisplay() {
  const weaponDamage = useRecoilState(weaponDamageSelector);

  return (
    <div>
      <p>Weapon damage: {weaponDamage}</p>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

创建原子族

在武士世界中,一个家族可能拥有多名武士,每位武士都有其独特的特征和能力。类似地,在 React 应用中,可能存在多个需要共享状态但具有不同标识符或键的组件。

这时它就atomFamily派上用场了。它允许你创建一组结构相同但键或标识符不同的原子。例如,假设我们想要创建一组原子来表示一个氏族中不同武士的武器。

import { atomFamily } from 'recoil';

export const weaponAtomFamily = atomFamily({
  key: 'weaponAtomFamily',
  default: id => ({
    name: `Weapon - ${id}`,
    damage: 50,
  }),
});
Enter fullscreen mode Exit fullscreen mode

在上述示例中,id默认函数的参数是该家族中每个原子的唯一标识符。因此,当我们调用weaponAtomFamily('Wakizashiv')该函数时,默认函数将以“Wakizashiv”作为id参数调用,并返回一个表示该武士默认武器的对象。

在组件中使用 atomFamily

`An`atomFamily()接受的选项几乎与简单的 `T` 相同atom()。但默认值也可以参数化。这意味着您可以提供一个函数,该函数接受参数值并返回实际的默认值。

import React from 'react';
import { useRecoilState } from 'recoil';
import { weaponAtomFamily } from './atoms';

function WeaponDisplay() {
  const [weapon, setWeapon] = useRecoilState(weaponAtomFamily('Wakizashiv'));

  return (
    <div>
      <h1>{weapon.name}</h1>
      <p>Damage: {weapon.damage}</p>
      <button onClick={() => setWeapon({ name: 'Weapon - Nodachi', damage: 70 })}>
        Upgrade Weapon
      </button>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

为什么要使用后坐力?

相比其他 React 状态管理库(例如 Redux),Recoil 具有诸多优势。让我们来看看在 React 项目中使用 Recoil 的一些原因:

简化的状态管理

Recoil 提供了一种更简单、更直观的方式来管理 React 应用的状态。使用Recoil,您可以定义原子选择器来表示应用的状态。组件可以订阅这些原子和选择器,以便在它们的值发生变化时收到通知。

没有模板

Recoil 还减少了管理 React 应用状态所需的样板代码量。它允许你用最少的样板代码定义原子和选择器。
另一方面,在Redux中,你需要定义 actions、action creators、reducers 和 store 对象来管理应用的状态。

性能更佳

Recoil 比其他 React 状态管理库性能更佳。这是因为 Recoil 使用了一种名为依赖图的新算法,该算法能够更高效地跟踪原子和选择器之间的依赖关系。依赖图确保当原子或选择器的状态发生变化时,只有需要重新渲染的组件才会被重新渲染,从而提升应用的性能。

熟悉的语法

useState()Recoil 使用的语法与 React 内置的 hooks(例如 ` require` 和 `require` )类似useEffect()。这使得 Recoil 对于已经熟悉 React 的开发人员来说易于学习和使用。

灵活且可扩展

Recoil 的设计兼顾灵活性和可扩展性。它可用于管理具有复杂状态需求的小型或大型应用程序的状态。它允许您定义原子和选择器来表示应用程序状态的不同部分,并提供工具来管理这些原子和选择器之间的依赖关系。


反冲之战与重制版

图片描述


所以,我的武士同胞们,让我们作为无畏的武士,共同迈向冒险的最终篇章吧……


什么是原子效应?

Atom Effects是 Recoil 的一项功能,它允许你在原子值发生变化时执行副作用。副作用是指任何会对原子状态之外产生影响的操作,例如网络请求、本地存储或日志记录。

原子效应通过 effects 选项附加到原子上。每个原子都可以引用一个原子效应函数数组,这些函数在原子初始化时按优先级顺序调用。

借助 Atom Effects,您可以为 Atom 添加订阅,这些订阅会在 Atom 的值发生变化时触发。订阅可以执行应用程序所需的任何副作用。这些副作用可以是同步的,也可以是异步的。

在需要根据应用当前状态执行副作用的情况下,Atom Effects 非常有用。例如,当用户更改设置页面时,您可能希望将用户的偏好设置保存到本地存储。

原子效应是塑造我们周围世界的隐藏力量,就像武士刀是由其原子间看不见的相互作用塑造而成的一样。

为了让你明白我的意思……

import { atom, useRecoilState } from 'recoil';

export const weaponState = atom({
  key: "weaponState",
  default: {
    name: "Katana",
    damage: 50,
  },
  /* Atom Effects */
  effects: [
    ({ onSet }) => {
      onSet(weapon => {
        console.log(`The weapon has upgrade to ${weapon.name}`);
      });
    },
  ],
});

function WeaponDisplay() {
  const [weapon, setWeapon] = useRecoilState(weaponState);

  return (
    <div>
      <h1>{weapon.name}</h1>
      <button onClick={() => setWeapon({ name: 'Nodachi' })}>
        Upgrade Weapon
      </button>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

onSet当原子值发生变化时,就会调用回调函数weaponState在上面的例子中,我们只是将原子的新武器值记录到控制台,但我们也可以很容易地执行更复杂的副作用。


冒险结束

Recoil 构建于 React 的 Context API 之上,并提供了一种比 Context API 更强大、更灵活的应用程序状态管理方式。它允许您定义原子(atoms)和选择器(selector)来表示应用程序的状态。组件可以订阅这些原子和选择器,以便在它们的值发生变化时收到通知。与其他 React 状态管理库相比,Recoil 具有诸多优势,例如简化的状态管理、无需样板代码、更高的性能、更易于理解的语法以及更强的灵活性和可扩展性。如果您正在为您的 React 项目寻找状态管理库,Recoil 绝对值得考虑。

各位武士同胞,让我们学习反冲之术,掌握治国之道。


动机

动机


🍀支持

请考虑关注并订阅我们的频道以示支持。您的支持对我们至关重要,它将帮助我们继续创作更多精彩内容。提前感谢您的支持!

YouTube
Discord
GitHub

感谢您提前给予的支持。

文章来源:https://dev.to/codeofrelevancy/recoil-is-the-samurai-sword-of-react-state-management-5h3c