介绍
提供跨组件和页面的共享状态能力,作为Vuex的替代品,专为Vue3设计的状态管理库。
- Vuex:在Vuex中,更改状态必须通过Mutation或Action完成,手动触发更新。
- Pinia:Pinia的状态是响应式的,当状态发生变化时,组件会自动更新,无需手动触发。
官方文档 :https://pinia.vuejs.org/zh/getting-started.html
使用Pinia对用户的登录信息进行保存
安装
npm install pinia
引入
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
const app =createApp(App)
app.use(createPinia())
app.mount('#app')
定义Stroe
目录结构:src/store/user.js
import {defineStore} from 'pinia'
import {reactive, ref} from "vue";
//导入pinia
//user表示模块名
export const useUser =defineStore('user',()=>{
//定义数据(state)d
const userId=ref(6699)
//用户ID
const level =ref(10) //等级
const userMsg=reactive({
token:'addadgsadadadada',
phone:'13111111111',
age:13
})
//用户信息
const list =ref([])
//操作数据的函数(action 同步+异步)
const updateUser=(newUserId)=>{
userId.value=newUserId
}
//修改账号信息
//数据返回出去 注:对象的形式
return{
userId,
updateUser,
userMsg
}
})
读取Stroe
<template>
<h1>用户ID{{userStore.userId}}</h1>
<h1>用户信息{{userStore.userMsg}}</h1>
</template>
<script setup>
import {useUser} from "@/store/user.js";
//导入store
const userStore =useUser()
//得到 user 模块返回的对象
</script>
读取成功
修改Stroe
<script setup>
import {useUser} from "@/store/user.js";
//导入store
const userStore =useUser()
//得到 user 模块返回的对象
function updateUser(){
userStore.updateUser('1334')
}
</script>
Action异步
Store
// src/store/user.js
const getList=async ()=>{
const res =await axios.get('https://tools.mgtv100.com/external/v1/bank_names').then(r=>{
list.value=r.data.data
})
}
组件
<div v-for="item in userStore.list" :key="item.id">{{item.bank_name}}</div>
onMounted(()=>{
getList()
})
function getList(){
userStore.getList()
}
Getter计算
<template>
<h1>计算后等级: {{userStore.cmpLevel}}</h1>
</template>
src/store/user.js
//getter
const cmpLevel=computed(()=>{
return level.value*2
//该函数用来计算等级
})
return {cmpLevel}
// src/store/user.js