@dbeining/react-atom

中文文档
4.1.21发布于 2021/08/04MITTypeScriptCommonJS近 30 天下载 2.5万

国家管理使反应变得简单。 建于"反应钩"上. 灵感来自 atom单位 reagent.cljs。 。 。 .

中文使用文档
文档目录16 节
  1. 管理共享状态的简单方法 反应
  2. 在反应上建造 钩子 API
  3. 灵感来自 原子 单位 试剂.cljs
  4. 说明
  5. 让你的状态 Atom 数字 :
  6. 读取状态为 deref
  7. 更新状态 swap
  8. 副作用吗? 刚刚使用 swap
  9. 在状态变化上与 QQ 重交组件 useAtom QQ 自定义反应钩
  10. 为什么用 react-atom ? 吗?
  11. 安装
  12. 依赖关系
  13. 文档
  14. 代码示例 react-atom 行动
  15. 游戏 react-atom 在代码Sandbox中
  16. 贡献/反馈

react-atom logo

管理共享状态的简单方法 反应

在反应上建造 钩子 API

灵感来自 原子单位 试剂.cljs

TypeScript npm (scoped) npm bundle size (minified) npm bundle size (minified + gzip)

Build Status codecov npm

NpmLicense Commitizen friendly semantic-release

说明

react-atom 提供一种非常简单的方式来管理 React 中的状态, 对于全局应用程序状态和当地组件状态: QQAtoms.

让你的状态 Atom数字 :

import { Atom } from "@dbeining/react-atom";

const appState = Atom.of({
  color: "blue",
  userId: 1
});

读取状态为 deref

你不能检查 Atom 你必须直接声明 deref像这样

import { deref } from "@dbeining/react-atom";

const { color } = deref(appState);

更新状态 swap

你不能修改一个 Atom 直接说 更新状态的主要途径是: swap。这里是它的呼号:

function swap<S>(atom: Atom<S>, updateFn: (state: S) => S): void;

updateFn 适用于 atom'状态和返回值被设定为 atom新状态 只有两个简单的规则 updateFn数字 :

  1. 它必须返回与上一个状态相同的类型/接口的值
  2. 它不能改变 以前的状态

说明一下,我们如何更新 appState颜色 :

import { swap } from "@dbeining/react-atom";

const setColor = color =>
  swap(appState, state => ({
    ...state,
    color: color
  }));

注意我们 updateFn 实值 传播将旧状态置入新对象后再压倒 color这很容易遵守 updateFn。 。 。 .

副作用吗? 刚刚使用 swap

你不需要做任何特别的 管理副作用。 照常写你的IO相关逻辑,然后打电话 swap 当你得到了你需要的。 例如:

const saveColor = async color => {
  const { userId } = deref(appState);
  const theme = await post(`/api/user/${userId}/theme`, { color });
  swap(appState, state => ({ ...state, color: theme.color }));
};

在状态变化上与 QQ 重交组件useAtomQQ 自定义反应钩

useAtom 是一个 自定义反应钩它做两件事:

  1. 返回原子的当前状态(如 deref),以及
  2. 将您的组件订阅到原子上, 这样它每次状态变化时都会重递

看起来是这样的:

export function ColorReporter(props) {
  const { color, userId } = useAtom(appState);

  return (
    <div>
      <p>
        User {userId} has selected {color}
      </p>
      {/* `useAtom` hook will trigger a re-render on `swap` */}
      <button onClick={() => swap(appState, setRandomColor)}>Change Color</button>
    </div>
  );
}

Nota Bene:您也可以使用选择器通过使用 options.select 参数. 读取文件 详细情况.

为什么用 react-atom? 吗?

😌 微小 API / 学习曲线
`Atom.of'、`使用Atom'和`swap'将涵盖绝大多数的使用案例.
🚫 没有锅炉板,只有可预测的状态管理
减速器? 行动? 汤克斯? 萨加斯? 不,只是"扫荡(原子,新国家)".
🎵 表演部件渲染训练
这个 useAtom 钩子接受可选 select 函数让组件订阅计算状态。 这意味着该组件只有在返回的值从 select 变化.
😬 React.useState 玩不开心 React.memo
useState 很酷,直到你意识到,在大多数情况下,它迫使你通过每个渲染处的道具传递新的函数实例,因为你通常需要包接 setState 函数。 这很难利用 React.memo。例如:
-- -- . .
function Awkwardddd(props) {
  const [name, setName] = useState("");
  const [bigState, setBigState] = useState({ ...useYourImagination });

  const updateName = evt => setName(evt.target.value);
  const handleDidComplete = val => setBigState({ ...bigState, inner: val });

  return (
    <>
      <input type="text" value={name} onChange={updateName} />
      <ExpensiveButMemoized data={bigState} onComplete={handleDidComplete} />
    </>
  );
}

每一次 input 火灾 onChange, (中文(简体) ), ExpensiveButMemoized 必须重新投降,因为 handleDidComplete 与最后通过的判决不完全相同.

反应文件承认这很尴尬 建议利用背景来研究,因为 替代品是超曲折的。 。 。 .

与 react-atom这个问题根本不存在 您可以在组件外定义您的更新功能, 以便它们具有优异的稳定性 .

const state = Atom.of({ name, bigState: { ...useYourImagination } });

const updateName = ({ target }) => swap(state, prev => ({ ...prev, name: target.value }));

const handleDidComplete = val =>
  swap(state, prev => ({
    ...prev,
    bigState: { ...prev.bigState, inner: val }
  }));

function SoSmoooooth(props) {
  const { name, bigState } = useAtom(state);

  return (
    <>
      <input type="text" value={name} onChange={updateName} />
      <ExpensiveButMemoized data={bigState} onComplete={handleDidComplete} />
    </>
  );
}
TS 翻译 第一等类型脚本支持
react-atom 以 TypeScript 写成,这样每个版本都会以正确,高质量的打字方式发布.
👣 小脚印
react-atom minified file size react-atom minified+gzipped file size
⚛️ 拥抱与虎克的未来
虎克会做的 class 部件及其种类(更高级部件、成品相干部件和随子功能相干部件)已过时. react-atom 使得管理共享状态变得容易,只有函数组件和钩子.

安装

npm i -S @dbeining/react-atom

依赖关系

react-atom 有一个捆绑的依赖, @libre/原子语,它提供了原子数据类型。 其全部再出口自 @dbeining/atom文档 这里。 。 。 .

react-atom 也有两个 peerDependencies,即:, react@^16.8.0 财务报告和审定财务报表 react-dom@^16.8.0包含Hooks API.

文档

react-atom API 密码

@libre/atom API 密码

代码示例 react-atom 行动

点击代码样本
import React from "react";
import ReactDOM from "react-dom";
import { Atom, useAtom, swap } from "@dbeining/react-atom";

//------------------------ APP STATE ------------------------------//

const stateAtom = Atom.of({
  count: 0,
  text: "",
  data: {
    // ...just imagine
  }
});

//------------------------ EFFECTS ------------------------------//

const increment = () =>
  swap(stateAtom, state => ({
    ...state,
    count: state.count + 1
  }));

const decrement = () =>
  swap(stateAtom, state => ({
    ...state,
    count: state.count - 1
  }));

const updateText = evt =>
  swap(stateAtom, state => ({
    ...state,
    text: evt.target.value
  }));

const loadSomething = () =>
  fetch("https://jsonplaceholder.typicode.com/todos/1")
    .then(res => res.json())
    .then(data => swap(stateAtom, state => ({ ...state, data })))
    .catch(console.error);

//------------------------ COMPONENT ------------------------------//

export const App = () => {
  const { count, data, text } = useAtom(stateAtom);

  return (
    <div>
      <p>Count: {count}</p>
      <p>Text: {text}</p>

      <button onClick={increment}>Moar</button>
      <button onClick={decrement}>Less</button>
      <button onClick={loadSomething}>Load Data</button>
      <input type="text" onChange={updateText} value={text} />

      <p>{JSON.stringify(data, null, "  ")}</p>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById("root"));

游戏 react-atom 在代码Sandbox中

你可以玩游戏 react-atom 立即在下列链接中没有设置 :

Java 脚本沙盒类型脚本沙盒
try react-atomtry react-atom

贡献/反馈

如果您有任何问题和建议,请开始讨论 改进/特性,或想要提交错误修正的PR(请包括 (如果适用的话).

版本与发布记录

@dbeining/react-atom 共发布 50 个版本,首次发布于 2018/11/20;过去 12 个月发布了 0 个版本。

版本发布日期距今
4.1.21latest2021/08/045 年前
4.1.202021/06/105 年前
4.1.192021/05/265 年前
4.1.182021/05/085 年前
4.1.172021/05/075 年前
4.1.162021/04/175 年前

关于 @dbeining/react-atom 的常见问题

@dbeining/react-atom 是什么?

国家管理使反应变得简单。 建于"反应钩"上. 灵感来自 atom单位 reagent.cljs。 。 。 .

如何安装 @dbeining/react-atom?

在项目目录运行 npm install @dbeining/react-atom,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>=16.7.0-alpha.0 || >=16.8.0-alpha.0 || >= 16.8.0 < 17)、react-dom(>=16.7.0-alpha.0 || >=16.8.0-alpha.0 || >= 16.8.0 < 17)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@dbeining/react-atom 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@dbeining/react-atom 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@dbeining/react-atom 可以商用吗?

@dbeining/react-atom 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@dbeining/react-atom 的下载量有多少?

根据 npm 官方下载统计,@dbeining/react-atom 在 2026/10/12 – 2026/11/10 这 30 天内被下载 24,748 次,日均约 825 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dbeining/react-atom 还在维护吗?

最新版本 4.1.21 发布于 2021/08/04(5 年前);至今共发布 50 个版本,其中过去 12 个月发布了 0 个;首次发布于 2018/11/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。