定义 Store
Store 使用 defineStore() 进行定义。它的第一个参数是一个唯一的 ID,Pinia 使用它来标识这个 Store。
同一个 Pinia 实例内的 Store ID 应唯一。重复定义会在开发时告警,请为不同 Store 使用不同 ID。
import { defineStore } from 'pinia-react'
// `defineStore()` 会根据 Store ID 自动生成命名函数。
// 对于 `alerts`,生成的函数是 `useAlertsStore` 和 `getAlertsStore`。
const { useAlertsStore, getAlertsStore } = defineStore('alerts', {
// 其他配置...
})
按照惯例,建议导出的 Hook 名称以 use 开头并以 Store 结尾(例如 useUserStore, useCartStore)。这符合 React Hooks 的命名规范。
Option Store (选项式 Store)
你需要通过传递一个包含 state、getters 和 actions 属性的选项对象来定义 Store 的配置。
export const { useCounterStore, getCounterStore } = defineStore('counter', {
state: () => ({ count: 0, name: 'Eduardo' }),
getters: {
doubleCount: (state) => state.count * 2,
},
actions: {
increment() {
this.count++
},
},
})
使用 Store
定义好 Store 后,只需在组件中导入并调用对应的 Hook 即可。
import React from 'react';
import { useCounterStore } from './counterStore';
export function App() {
const counter = useCounterStore();
return (
<div>
<h2>Pinia-React Count: {counter.count}</h2>
</div>
);
}
Provider 与组件外访问
组件 Hook 优先使用最近的 PiniaProvider,其次是 active Pinia。普通访问函数不读取 React Context,多实例服务使用 getCounterStore(pinia)。实例生命周期见组件外使用,请求快照见 Next.js。简单的单根客户端接入不需要 Provider。