阅读量:0
介绍
提供跨组件和页面的共享状态能力,作为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