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

 

posted @ 2022-07-21 18:42  刘宏缔的架构森林  阅读(411)  评论(0编辑  收藏  举报