API 参考
完整的 React-Pinia API 文档。
createStore
创建一个全局状态管理 store。
类型签名
typescript
function createStore<T extends { [K in keyof T]: T[K] }>(
options: {
[K in keyof T]: StateOption<T[K]>
}
): Store<T>参数
- options:
Object- Store 配置对象- 键名为模块名称
- 值为
StateOption配置
返回值
返回一个 Store 实例,包含所有定义的模块。
示例
typescript
const store = createStore<State>({
user: {
state: () => ({ name: 'Alice' }),
actions: {
setName(name: string) {
this.name = name
},
},
},
counter: {
state: () => ({ count: 0 }),
},
})Provider
React 组件,用于向子组件提供 store。
Props
- store:
Store- createStore 返回的 store 实例 - children:
ReactNode- 子组件
示例
tsx
<Provider store={store}>
<App />
</Provider>useStore
React Hook,用于在组件中访问 store。
类型签名
typescript
// 获取完整状态
function useStore<T, K extends keyof T>(
key: K
): State<T[K]> & Getters<T[K]> & Actions<T[K]> | null
// 使用 selector
function useStore<T, K extends keyof T, S>(
key: K,
selector: (state: State<T[K]> & Getters<T[K]> & Actions<T[K]>) => S
): S | null参数
- key:
string- 模块的键名 - selector:
Function(可选) - 选择器函数,用于选择部分状态
返回值
- 不使用 selector:返回完整的状态对象(包含 state、getters、actions)
- 使用 selector:返回 selector 函数的返回值
- 如果模块不存在:返回
null
示例
typescript
// 获取完整状态
const user = useStore<State, 'user'>('user')
// 使用 selector
const name = useStore<State, 'user', string>(
'user',
(state) => state.name
)StateOption
定义单个 store 模块的配置选项。
类型定义
typescript
interface StateOption<T> {
state: () => State<T>
actions?: {
[key: string]: (this: State<T>, ...args: any[]) => unknown
}
getters?: {
[key: string]: (state: State<T>) => unknown
}
persist?: Persist
deep?: boolean
}属性
state
- 类型:
() => State<T> - 必需: 是
- 描述: 返回初始状态的函数
typescript
state: () => ({
count: 0,
name: 'Alice',
})actions
- 类型:
Object - 必需: 否
- 描述: 定义修改状态的方法,
this指向当前状态
typescript
actions: {
increment() {
this.count++
},
setName(name: string) {
this.name = name
},
}getters
- 类型:
Object - 必需: 否
- 描述: 定义计算属性,基于状态派生新值
typescript
getters: {
doubleCount(state) {
return state.count * 2
},
fullName(state) {
return `${state.firstName} ${state.lastName}`
},
}persist
- 类型:
Persist - 必需: 否
- 描述: 持久化配置
typescript
persist: {
key: 'my-store',
storage: 'localStorage', // 或 'sessionStorage'
}deep
- 类型:
boolean - 必需: 否
- 默认值:
true - 描述: 是否深度监听嵌套对象
typescript
deep: false // 关闭深度监听Persist
持久化配置类型。
类型定义
typescript
interface Persist {
key: string
storage?: 'localStorage' | 'sessionStorage'
}属性
- key:
string- 存储的键名 - storage:
'localStorage' | 'sessionStorage'- 存储类型,默认'localStorage'
示例
typescript
persist: {
key: 'user-data',
storage: 'sessionStorage',
}类型工具
State<T>
提取状态类型(排除 actions 和 getters)。
typescript
type State<T> = Omit<T, 'actions' | 'getters'>Getters<T>
提取 getters 类型。
typescript
type Getters<T> = T extends { getters: infer G } ? G : {}Actions<T>
提取 actions 类型。
typescript
type Actions<T> = T extends { actions: infer A } ? A : {}Store 实例方法
get()
获取原始状态对象(不触发 React 渲染)。
typescript
const rawState = store.user.get()
console.log(rawState.name)
// 修改状态
rawState.name = 'Bob'注意
get() 返回的是原始状态对象,修改它会影响所有订阅者,但不会自动触发组件重渲染。主要用于在组件外部访问或修改状态。
完整示例
typescript
import { createStore, Provider, useStore } from 'react-pinia'
// 1. 定义类型
interface UserState {
name: string
age: number
actions: {
setName(name: string): void
incrementAge(): void
}
getters: {
displayName: string
isAdult: boolean
}
}
interface State {
user: UserState
}
// 2. 创建 store
const store = createStore<State>({
user: {
state: () => ({
name: 'Alice',
age: 25,
}),
actions: {
setName(name: string) {
this.name = name
},
incrementAge() {
this.age++
},
},
getters: {
displayName(state) {
return `User: ${state.name}`
},
isAdult(state) {
return state.age >= 18
},
},
persist: {
key: 'user-store',
storage: 'localStorage',
},
},
})
// 3. 提供 store
function App() {
return (
<Provider store={store}>
<UserProfile />
</Provider>
)
}
// 4. 使用 store
function UserProfile() {
const user = useStore<State, 'user'>('user')
return (
<div>
<h1>{user?.displayName}</h1>
<p>Age: {user?.age}</p>
<p>{user?.isAdult ? '成年人' : '未成年'}</p>
<button onClick={() => user?.incrementAge()}>
增加年龄
</button>
</div>
)
}TypeScript 支持
React-Pinia 提供完整的 TypeScript 支持。所有类型都会自动推导:
typescript
const user = useStore<State, 'user'>('user')
// ✅ TypeScript 知道这些属性和方法
user?.name // string
user?.age // number
user?.displayName // string (getter)
user?.isAdult // boolean (getter)
user?.setName // (name: string) => void (action)
// ❌ TypeScript 会报错
user?.unknownProp // Error: Property 'unknownProp' does not exist最佳实践
1. 始终定义类型
typescript
// ✅ 好
interface UserState { /* ... */ }
const store = createStore<State>({ /* ... */ })
// ❌ 不好
const store = createStore({ /* ... */ }) // 缺少类型2. 使用 Selector 优化性能
typescript
// ✅ 好:只订阅 name
const name = useStore<State, 'user', string>(
'user',
(state) => state.name
)
// ❌ 不好:订阅整个对象
const user = useStore<State, 'user'>('user')
const name = user?.name3. Actions 中处理副作用
typescript
// ✅ 好
actions: {
async loadData() {
this.loading = true
const data = await fetchData()
this.data = data
this.loading = false
}
}
// ❌ 不好:在组件中处理
const user = useStore<State, 'user'>('user')
const loadData = async () => {
user.loading = true
const data = await fetchData()
user.data = data
user.loading = false
}