使用步骤:
- 安装
yarn add pinia
# or
npm i pinia
- 导入,实例化,当做插件使用,和其他插件使用套路相同
为了更好的功能维护,在store文件下导入实例pinia
store/index.ts
下载数据存储持久化插件
npm i pinia-plugin-persistedstate
/**
* 功能:维护pinia
* 创建的pinia仓库从这里统一导出
*/
import { createPinia } from 'pinia'
// pinia-plugin-persistedstate 持久化存储插件
import persist from 'pinia-plugin-persistedstate'
const pinia = createPinia()
// vue使用pinia插件 .use(pinia里面的插件-持久化存储)
pinia.use(persist)
export default pinia
// 完整写法
// import { useUserStore } from './user'
// export { useUserStore }
// 统一导出:和上面两行完整写法是等价的
export * from './user'
export * from './modules/consult'
main.ts
import { createApp } from 'vue'
import App from './App.vue'
// 引入路由
import router from './router'
// 引入仓库
import pinia from './stores'
// 引入vant样式,(在全局样式前导入方便自定义样式的覆盖)
import 'vant/lib/index.css'
// 引入全局样式
import './styles/main.scss'
import 'virtual:svg-icons-register'
const app = createApp(App)
app.use(router)
app.use(pinia)
app.mount('#app')
- 创建仓库&使用仓库
store/user.ts
import { defineStore } from "pinia"
import { computed, ref } from "vue"
// cp-user 持久化存储仓库的名称
export const useUserStore= defineStore("cp-user", () => {
// 1.用户信息
const user = ref<User>()
// 2.修改用户信息
const setUser = (u: User) => {
user.value = u
}
// 3.删除用户信息
const delUser = () => {
user.value = undefined
}
return {
user,
setUser,
delUser
},
// 开启持久化,使用本地存储,默认使用localStorage
{ persist: true }
// {
// persist: {
// key: 'store-key',
// storage: window.sessionStorage,
// paths: ['nested.data'],
// beforeRestore: (context) => {
// console.log('Before hydration...')
// },
// afterRestore: (context) => {
// console.log('After hydration...')
// }
// }
// }
})
home.vue页面引入store数据
<script setup lang="ts">
// 引入定义的store仓库 useUserStore
import { useUserStore} from "./store/counter"
// store中有状态和函数
const store = useCounterStore()
console.log(store.user,store.setUser,store.delUser)
</script>
storeToRefs的使用
使用 storeToRefs 解决解构仓库状态丢失响应式的问题
问题:
- 当我们想解构 store 提供的数据时候,发现数据是没有响应式的。
回忆:
- 在学习 vue 组合式API创建的响应式数据的时候,使用
toRefs
保持结构后数据的响应式
方案:
- 使用
storeToRefs
解决解构仓库状态丢失响应式的问题
代码:
- 进行状态管理
// state
const count = ref(100)
// getters
const doubleCount = computed(() => count.value * 2)
// mutations
const update = () => count.value++
// actions
const asyncUpdate = () => {
setTimeout(() => {
count.value++
}, 1000)
}
return { count, doubleCount, update, asyncUpdate }
<template>
APP {
{ store.count }} {
{ store.doubleCount }}
<button @click="store.update()">count++</button>
<button @click="store.asyncUpdate()">async update</button>
</template>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
const { count, doubleCount } = storeToRefs(store)
小结:
- 当你想从 store 中解构对应的状态使用,需要使用
storeToRefs