Skyroc Admin Docs
@core 基础设施

@skyroc/core-state

Jotai 状态封装,提供全局 store、持久化 atom 与存储注册表

概览

包名@skyroc/core-state
版本1.0.0
peer 依赖jotai >= 2.0.0react >= 18.0.0
测试✅ 6 个测试文件

封装 Jotai,提供一个包级单一 store,并解决两个常见问题:在 React 之外读写 atom、以及 atom 持久化与存储后端解耦。

核心导出

类别导出
ProviderJotaiProvider
全局 storeglobalStoregetAtomValuesetAtomValueupdateAtomValue
持久化createAtomWithStorageatomWithPartial
存储注册表registerStoragegetStoragehasStorageunregisterStorage

架构

StorageRegistry(注册存储适配器)

globalStore(createStore,React 内外通用)

atom / createAtomWithStorage(持久化 atom)

JotaiProvider(<Provider store={globalStore}>)

全局 store:在 React 外读写

import { globalStore, getAtomValue, setAtomValue, updateAtomValue } from '@skyroc/core-state';

// 在拦截器、工具函数等非组件代码里读写 atom
const token = getAtomValue(tokenAtom);
setAtomValue(tokenAtom, 'new-token');
updateAtomValue(countAtom, c => c + 1);

应用在最外层挂载 JotaiProvider,保证组件树与 globalStore 用的是同一个 store。

存储注册表:解耦持久化后端

不同平台的存储不同(Web localStorage、RN AsyncStorage)。注册表让 atom 不直接依赖具体存储:

import { registerStorage, createAtomWithStorage } from '@skyroc/core-state';

// 应用启动时注册一个存储适配器
registerStorage('local', {
  getItem: k => localStorage.getItem(k),
  setItem: (k, v) => localStorage.setItem(k, v),
  removeItem: k => localStorage.removeItem(k)
});

// 创建持久化 atom,引用注册表里的 'local'
const themeAtom = createAtomWithStorage('theme', 'light', { storage: 'local' });

AtomStorage 接口:getItem / setItem / removeItem / 可选 subscribe

部分更新 atom

atomWithPartial 支持「只更新部分字段」并自带 no-op 检测(Object.is 比较,无变化不触发更新):

import { atomWithPartial } from '@skyroc/core-state';

const settingsAtom = atomWithPartial({ theme: 'light', lang: 'zh-CN' });
// 更新时只传部分字段
set(settingsAtom, { theme: 'dark' });

在应用中的应用

Admin 应用通过本包的 JotaiProvider + globalStore 统一状态:主题、语言、菜单、标签页等 atom 都挂在同一个 store 上,并用 useAtom(..., { store: globalStore }) 对齐。详见 Admin 状态管理

On this page