React MobX
React MobX 是一个用于 React 应用的 MobX 状态管理工具包,它提供了依赖注入式的状态管理方案。
特性
- 支持依赖注入式的状态管理
- 支持懒加载状态
- 提供完整的 TypeScript 类型支持
- 基于 MobX 的响应式状态管理
- 支持状态观察和自动更新
- 支持非响应式状态管理
安装
npm install @kazura/react-mobx
使用方法
创建 Store
import { makeAutoObservable } from 'mobx'
class UserStore {
name: string = ''
age: number = 0
constructor() {
makeAutoObservable(this)
}
setName(name: string) {
this.name = name
}
setAge(age: number) {
this.age = age
}
}
export { UserStore }
配置 Provider
import { MobxProvider, createStores } from '@kazura/react-mobx'
import { UserStore } from './stores/user.store'
const stores = createStores([
UserStore,
{
provide: 'ConfigStore',
useClass: ConfigStore,
scope: Scope.LAZY, // 懒加载
},
])
function App() {
return (
<MobxProvider stores={stores}>
<YourApp />
</MobxProvider>
)
}
在组件中使用 Store
import { useStore } from '@kazura/react-mobx'
import { UserStore } from './stores/user.store'
function UserProfile() {
const userStore = useStore(UserStore)
return (
<div>
<h1>User Profile</h1>
<p>Name: {userStore.name}</p>
<p>Age: {userStore.age}</p>
<button onClick={() => userStore.setName('John')}>Change Name</button>
<button onClick={() => userStore.setAge(30)}>Change Age</button>
</div>
)
}
API 参考
MobxProvider
interface MobxProviderProps {
children: React.ReactNode
stores: IStores
}
const MobxProvider: React.FC<React.PropsWithChildren<MobxProviderProps>>
MobX Provider 组件,用于提供状态管理上下文。会自动观察状态变化并触发更新。
参数:
children
: 子组件stores
: MobX 状态存储实例
MobxInactiveProvider
const MobxInactiveProvider: React.FC<React.PropsWithChildren<MobxProviderProps>>
非响应式的 MobX Provider 组件,不会自动观察状态变化,只在 stores 引用变化时更新。
参数:
children
: 子组件stores
: MobX 状态存储实例
useStore
function useStore<TInput = any, TResult = TInput>(
typeOrToken: Type<TInput> | string | symbol
): TResult
用于获取 Store 实例的 Hook。如果 Store 未提供,会抛出错误。
参数:
typeOrToken
: Store 类型或注入令牌
返回值:
- Store 实例
MobxMap
class MobxMap {
constructor(providers?: Provider[])
init(): void
get<TInput = any, TResult = TInput>(typeOrToken: Type<TInput> | string | symbol): TResult
has(token: InjectionToken): boolean
values(): IterableIterator<InstanceType<Type>>
keys(): IterableIterator<InjectionToken>
entries(): IterableIterator<[InjectionToken, InstanceType<Type>]>
[Symbol.iterator](): IterableIterator<[InjectionToken, InstanceType<Type>]>
}
MobX 状态存储映射类,实现了 Map 接口。
createStores
function createStores(providers: Provider[]): MobxMap
创建 MobX 状态存储实例。
参数:
providers
: 提供者数组
返回值:
- MobX 状态存储实例
类型定义
Type
interface Type<T = any> extends Function {
new (...args: any[]): T
}
类型定义接口。
InjectionToken
type InjectionToken<T = any> = string | symbol | Type<T>
注入令牌类型。
Scope
enum Scope {
DEFAULT = 0,
LAZY = 1,
}
作用域枚举。
ClassProvider
interface ClassProvider<T = any> {
provide: InjectionToken
useClass: Type<T>
scope?: Scope
}
类提供者接口。
Provider
type Provider<T = any> = Type<any> | ClassProvider<T>
提供者类型。
注意事项
- 确保在使用 Store 之前配置了 MobxProvider
- 使用 makeAutoObservable 或 makeObservable 来使 Store 可观察
- 懒加载的 Store 会在第一次使用时初始化
- 建议使用 TypeScript 来获得更好的类型提示
- MobxProvider 会自动观察状态变化并触发更新
- MobxInactiveProvider 不会自动观察状态变化,适合不需要响应式更新的场景
- Store 未提供时会抛出错误,请确保正确配置了 Provider
示例
创建多个 Store
import { makeAutoObservable } from 'mobx'
class UserStore {
name: string = ''
age: number = 0
constructor() {
makeAutoObservable(this)
}
setName(name: string) {
this.name = name
}
setAge(age: number) {
this.age = age
}
}
class ConfigStore {
theme: string = 'light'
language: string = 'en'
constructor() {
makeAutoObservable(this)
}
setTheme(theme: string) {
this.theme = theme
}
setLanguage(language: string) {
this.language = language
}
}
export { UserStore, ConfigStore }
使用懒加载 Store
import { MobxProvider, createStores, Scope } from '@kazura/react-mobx'
import { UserStore, ConfigStore } from './stores'
const stores = createStores([
UserStore,
{
provide: 'ConfigStore',
useClass: ConfigStore,
scope: Scope.LAZY,
},
])
function App() {
return (
<MobxProvider stores={stores}>
<YourApp />
</MobxProvider>
)
}
使用非响应式 Provider
import { MobxInactiveProvider, createStores } from '@kazura/react-mobx'
import { UserStore } from './stores'
const stores = createStores([UserStore])
function App() {
return (
<MobxInactiveProvider stores={stores}>
<YourApp />
</MobxInactiveProvider>
)
}