globostate

中文文档
0.5.0发布于 2026/11/04MITTypeScriptES Module零依赖构建来源已验证

React的基于路径的状态容器

中文使用文档
文档目录9 节
  1. 开始
  2. 提供者
  3. 钩子
  4. 更新功能
  5. 路径
  6. 重新渲染
  7. 独立的商店
  8. 需求
  9. 把它们放在一起

Globostate

Globostate是一个 反应钩 这将创建一个全局的、不可变的状态,并允许您使用类似的路径语法来读取和更新它的任何部分 lodash的 _.get 和 _.set 功能。

它看起来是这样的:

const ExampleComponent = ()  => {
  const [count, setCount] = useGloboState('app.components.counterValue', 0)
  return (
    <main>
      <p>You clicked {count} times.</p>
      <button onClick={() => setCount(count + 1)}>Click Me</button>
    </main>
  )
}

开始

Globostate需要React作为对等依赖。首先:

npm i react react-dom globostate

提供者

Globostate包括一个 Provider 必须包装应用程序的组件:

import React from 'react'
import { createRoot } from 'react-dom/client'
import { Provider, useGloboState } from 'globostate'

const container = document.getElementById('app')
const root = createRoot(container)

root.render(
  <Provider>
    <App />
  </Provider>
)

钩子

这个 useGloboState hook的工作原理与React非常相似 useState 但是全局状态可以在应用程序的任何地方访问,而不需要通过props钻取状态。

useGloboState 接受两个参数。第一个是对象路径,用点和括号索引('lists.todos[0].title')或作为键数组(['lists', 'todos', 0, 'title']). 更新是不可变的:只复制该路径上的对象。第二种是初始状态,类似于 useState是唯一的参数。

const [todos, setTodos] = useGloboState('appState.lists.todos', [])

只要路径中还没有存储任何内容,就返回默认值。在调用setter之前,它不会被写入存储中。

更新功能

就像 useState, setter也接受一个函数。它接收当前值(或默认值,如果还没有存储)并返回下一个值:

const [count, setCount] = useGloboState('app.count', 0)
setCount(c => c + 1)

因为传递给setter的函数总是被视为更新器,所以通过包装来存储函数: setHandler(() => myFunction)。

路径

  • 点和括号: 'lists.todos[0].title' 和 'lists.todos.0.title' 都是同一条路。
  • 键数组: ['lists', 'todos', 0, 'title']. 当键包含点或括号时使用此格式。
  • 创建缺失的关卡: 当一个set经过一个还不存在的级别时,如果下一个键是一个非负整数,globostate将创建一个数组(0, 12),否则为普通对象。
  • 不支持: 引用的键,如 a["b"]。

重新渲染

组件只有在其路径上的值改变时才会重新呈现。数组和普通对象的比较比较比较浅,所以设置一个相等的副本不会重新渲染。其他所有内容,包括date、Maps、Sets和类实例,都是通过引用进行比较的,所以要替换这些值,而不是改变它们。

独立的商店

Provider 和 useGloboState 共享一个商店。要创建独立存储,例如为自包含的小部件或库创建独立存储,请调用 createProvider:

import { createProvider } from 'globostate'

const { Provider: WidgetProvider, useGloboState: useWidgetState } = createProvider()

需求

  • React 18或更新版本。
  • globostate作为ES模块发布。 import 作品无处不在。加载 require() 需要节点20.19+或22.12+。

把它们放在一起

完整的应用程序可能是这样的:

import React from 'react'
import { createRoot } from 'react-dom/client'
import { Provider, useGloboState } from 'globostate'

const App = () => {
  const [value, updateValue] = useGloboState('app.counterValue', 0)
  return (
    <main>
      <div><button onClick={() => updateValue(value - 1)}>-</button></div>
      <div>{value}</div>
      <div><button onClick={() => updateValue(value + 1)}>+</button></div>
    </main>
  )
}

const container = document.getElementById('app')
const root = createRoot(container)

root.render(
  <Provider>
    <App />
  </Provider>
)

版本与发布记录

globostate 共发布 7 个版本,首次发布于 2024/01/06;过去 12 个月发布了 1 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.5.0latest2026/11/04今天
0.4.22025/10/161 年前
0.4.12025/09/291.1 年前
0.4.02025/09/291.1 年前
0.3.02024/05/182 年前
0.2.02024/04/092 年前

关于 globostate 的常见问题

globostate 是什么?

React的基于路径的状态容器

如何安装 globostate?

在项目目录运行 npm install globostate,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>=18.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

globostate 支持 TypeScript 吗?

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

globostate 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

globostate 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^20.19.0 || >=22.12.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

globostate 可以商用吗?

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

globostate 还在维护吗?

最新版本 0.5.0 发布于 2026/11/04(今天);至今共发布 7 个版本,其中过去 12 个月发布了 1 个;首次发布于 2024/01/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。