vue.js3:用pinia做状态管理(vue@3.2.37 / pinia@2.0.16)
一,安装pinia库:
1,官网:
https://pinia.vuejs.org/
代码地址:
https://github.com/vuejs/pinia
2,安装:
liuhongdi@lhdpc:/data/vue/child$ npm -S install pinia added 2 packages in 3s
3,查看已安装库的版本:
liuhongdi@lhdpc:/data/vue/child$ npm list pinia child@0.1.0 /data/vue/child └── pinia@2.0.16
说明:刘宏缔的架构森林是一个专注架构的博客,
网站:https://blog.imgtouch.com
本文: https://blog.imgtouch.com/index.php/2023/06/02/vue-js3-yong-pinia-zuo-zhuang-tai-guan-li-vue-3-2-37-pinia/
对应的源码可以访问这里获取: https://github.com/liuhongdi/
或: https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,js代码:
1,main.js中引入
import { createApp } from 'vue'
import App from './App.vue'
import router from './route'
import { createPinia } from 'pinia'
const app = createApp(App)
app.use(router)
app.use(createPinia())
app.mount('#app')
2,App.vue中保存屏幕宽高
<template> <router-view /> </template> <script> import {onMounted} from "vue"; import {useScreenStore} from "@/store/screen"; export default { name: 'App', setup() { onMounted(()=>{ let screen = useScreenStore(); screen.setWidth(document.documentElement.clientWidth); screen.setHeight(document.documentElement.clientHeight); //窗口改变大小时 window.onresize = () => { //set store中的值 let screen = useScreenStore(); screen.setWidth(document.documentElement.clientWidth); screen.setHeight(document.documentElement.clientHeight); } }) } } </script> <style> html,body{ margin:0; padding:0; } #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; /*margin-top: 60px;*/ } </style>
3,Home.vue
<template> <div> <router-link :to="{ path: '/code/code', query: { codeId: 123 }}"> 去code页面 </router-link><br/> name:{{name}}<br/> age:{{age}}<br/> getter name:{{User.getName}}<br/> <button @click="change">change</button><br/> <button @click="reset">reset</button><br/> </div> </template> <script> import { storeToRefs } from 'pinia'; import { useUserStore } from '@/store'; import {} from 'vue' export default { name: "HomePage", setup() { // 获取store中的值 const User = useUserStore(); // 通过pinia自带的方法,转换成ref,就是响应式的了 let {name,age} = storeToRefs(User); //修改 const change = ()=> { User.$patch({ name: '擎天柱', age: 19 }) } //重置 const reset = ()=> { User.$reset() } return { User, name, age, change, reset, } } } </script> <style scoped> </style>
4,store/index.js
import {defineStore} from 'pinia'
export const useUserStore = defineStore("USER",{
state() {
return {
name: '威震天',
age: 18,
}
},
// 和vuex一样
getters: {
getName(){
if (this.name === '威震天') {
return this.name += "-霸天虎"
} else {
return this.name += "-汽车人"
}
},
},
// 和vuex一样
actions: {
setName(name) {
console.log("set name:");
this.name = name;
},
setAge() {
this.age--
}
}
})
5,store/screen.js
import {defineStore} from 'pinia'
export const useScreenStore = defineStore("Screen",{
state() {
return {
width: 0,
height: 0,
}
},
// 和vuex一样
getters: {
},
// 和vuex一样
actions: {
setWidth(width) {
console.log("set width:");
this.width = width;
},
setHeight(height) {
this.height = height;
},
}
})
6,Code.vue
<template> <div> <router-link :to="{ path: '/home/home', query: { codeId: 123 }}"> 去home页面 </router-link><br/> width:{{width}}<br/> height:{{height}}<br/> </div> </template> <script> import {useScreenStore} from "@/store/screen"; import {storeToRefs} from "pinia"; export default { name: "CodePage", setup() { // 获取store中的值 const screen = useScreenStore(); // 通过pinia自带的方法,转换成ref,就是响应式的了 let {width,height} = storeToRefs(screen) return { width, height, } } } </script> <style scoped> </style>
三,测试效果

四,查看vue框架的版本:
liuhongdi@lhdpc:/data/vue/child$ npm list vue child@0.1.0 /data/vue/child ├─┬ @vue/cli-plugin-babel@5.0.6 │ └─┬ @vue/babel-preset-app@5.0.6 │ └── vue@3.2.37 deduped ├─┬ pinia@2.0.16 │ ├─┬ vue-demi@0.13.5 │ │ └── vue@3.2.37 deduped │ └── vue@3.2.37 deduped ├─┬ vue-router@4.1.2 │ └── vue@3.2.37 deduped └─┬ vue@3.2.37 └─┬ @vue/server-renderer@3.2.37 └── vue@3.2.37 deduped
浙公网安备 33010602011771号