npm install pinia
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')
项目结构:

import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
state: () => ({
// 在该项中可以自定义状态数据
// ......
sum:0
}),
getters: {
// 该项等同于 Store 状态的 计算值,类似于计算属性
// ......
getDoubleSum(state) {
return state.sum*2
}
}
actions: {
// 相当于组件中的 methods,用于定义和处理业务逻辑
//.......
addSum(value: number) {
this.sum += value
}
}
})
<template>
<div>
<p>sum:{{useMainStore.sum}}p>
<p>doubleSum:{{useMainStore.getDoubleSum}}p>
<button @click="useMainStore.addSum(1)">sum+1button>
div>
template>
<script setup lang="ts">
import { mainStore } from "../store/index";
const useMainStore = mainStore()
script>
例如:
import { defineStore } from 'pinia'
export const mainStore = defineStore('main', {
state: () => ({
sum: 0,
}),
})
export const otherStore = defineStore('other', {
state: () => ({
doubleSum: 0
}),
getters: {
updateDoubleSum(state) {
// 获取 "mainStore" 的实例,并使用其中的 sum 状态
const useMainStore = mainStore()
state.doubleSum = useMainStore.sum * 2
return state.doubleSum
}
}
})
const store = useStore()
store.$reset()
const store = useStore()
store.$patch({
counter: store.counter + 1,
name: 'Abalam',
})
项目结构:

import { createPinia } from 'pinia'
import useUserStore from "./modules/user/index";
import useAppStore from "./modules/app/index";
const pinia = createPinia()
export { useUserStore, useAppStore }
export default pinia
import { createApp } from 'vue'
import App from './App.vue'
import pinia from "./pinia";
createApp(App).use(pinia).mount('#app')
export type RoleType = '' | 'admin' | 'user'
export interface UserState {
name?: string;
email?: string;
phone?: string;
introduction?: string;
role: RoleType;
}
import { defineStore } from "pinia";
import type { UserState, RoleType } from "./types";
import { getUserInfo } from "@/network/test";
const useUserStore = defineStore('user',{
state:():UserState=>({
name: undefined,
email: undefined,
phone: undefined,
introduction: undefined,
role:''
}),
getters:{
userInfo(state:UserState):UserState {
return {...state}
}
},
actions:{
setRole(role: RoleType) {
this.role = role
},
setInfo(partial: Partial<UserState>) {
this.$patch(partial);
},
resetInfo() {
this.$reset()
},
async info() {
const res:any = await getUserInfo();
this.setInfo(res.data);
},
}
})
export default useUserStore
上面的store均使用 options API 的写法,以下我们改为使用 composition API 模式定义store,改写法更符合Vue3 setup的编程模式,让结构更加扁平化,写法转化如下:
现在我们使用上面的写法把“目录一”创建的store改为 composition API 的写法:
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export const mainStore = defineStore('main', ()=>{
const sum = ref<number>(0)
const doubleSum = computed<number>(() => sum.value * 2)
const addSum = (value: number) => {
sum.value += value
}
return { sum, doubleSum, addSum }
})
提示:文章到此结束,文章仅为个人学习记录,若有不足还请大家指出。