详细文档请访问 pinia
安装
使用 npm
npm i pinia
使用 yarn
yarn add pinia
使用 pnpm
pnpm i pinia
在 vue 中使用
import { createPinia } from "pinia" import { createApp } from "vue" const app = createApp() const pinia = createPinia() app.use(pinia) app.mount("#app")
定义一个 Store
导出的 store 函数名一般使用 use 开头
import { defineStore } from "pinia" // 第一个参数在全局store中的唯一id export const useUserStore = defineStore("user", {})
在页面中使用 store
<script lang="ts" setup> import { useUserStore } from "@/store/model/userStore" const userStore = useUserStore() // 可以使用userStore.xx来访问store中的内容 </script>
or
<script lang="ts" setup> import { useUserStore } from "@/store/model/userStore" import { storeToRefs } from "pinia" const userStore = useUserStore() const { userInfo } = storeToRefs(userStore) </script>
State
import { defineStore } from "pinia" export const useUserStore = defineStore("user", { state: () => { return { userInfo: null, } }, })
在页面中访问 state
可以直接写入/读取状态
import { useUserStore } from "@/store/model/userStore" const userStore = useUserStore() userStore.userInfo = { name: "wxw", age: 23 } console.log(userStore.userInfo)
重置状态
import { useUserStore } from "@/store/model/userStore" const userStore = useUserStore() userStore.$reset()
Getters
可以等同于 vue 中的计算属性
import { defineStore } from "pinia" export const useUserStore = defineStore("user", { state: () => { return { userInfo: null, } }, getters: { getUserInfo() { return this.userInfo }, }, })
在页面中使用 getter
getter 是属性,访问时不需要使用函数的方式来访问
<script lang="ts" setup> import { useUserStore } from "@/store/model/userStore" const userStore = useUserStore() setTimeout(() => { userStore.userInfo = { name: "wxw", age: 23 } }, 3000) </script> <template> <div>{{ userStore.getUserInfo }}</div> </template>
Actions
相当于组件的方法(vue2 中的 methods)
import { defineStore } from "pinia" export const useUserStore = defineStore("user", { state: () => { return { userInfo: null, } }, getters: { getUserInfo() { return this.userInfo }, }, actions: { setUserInfo(userInfo) { this.userInfo = userInfo }, // 也支持异步方法 async setAdmin(userInfo) { // eslint-disable-next-line no-useless-catch try { const { code, data, message } = await setUserApi(userInfo) } catch (error) { throw error } }, }, })
在组件中使用
<script lang="ts" setup> import { useUserStore } from "@/store/model/userStore" const userStore = useUserStore() function setUser() { userStore.setUserInfo({ name: "wxw", age: 23 }) } </script> <template> <button @click="setUser"> 设置用户信息 </button> <div>{{ userStore.getUserInfo }}</div> </template>