vue3状态管理pinia踩过的坑

Pinia 是一个轻量级的状态管理库,它是 Vue.js 生态系统中的官方推荐状态管理库,它允许您跨组件/页面共享数据。Pinia它比 Vuex 更加现代化、模块化和易于使用。Pinia 的设计理念遵循了 Vue 3 的 Composition API,提供了更加灵活和简洁的 API。

pinia的安装


npm install pinia

创建 Pinia 实例

在 Vue 项目中,首先要创建一个 Pinia 实例,并将其挂载到 Vue 应用中。在main.ts或者main.js文件中添加:

import { createApp } from 'vue';
import ArcoVue from '@arco-design/web-vue';
import App from '@/App.vue';
import '@arco-design/web-vue/dist/arco.css';
import router from './router';
//引入pinia
import { createPinia } from 'pinia';
const app = createApp(App)
const pinia = createPinia();
app.use(ArcoVue);
app.use(router);
//挂载到项目中
app.use(pinia);
app.mount('#app')

在src文件夹下创建一个stores文件夹,来存放store文件。这里是创建了一个home.ts的store文件。这个文件主要是存放了模拟用户信息。

import { defineStore } from "pinia";
import {computed, reactive} from "vue";

export const useHomeStore = defineStore("homeStore",()=>{
    let _username = reactive({
        name:"小王王",
        age:20
    })

    const username = computed(()=>_username);
    const setUsername = (value:any)=>{
        //sessionStorage.setItem("username",JSON.stringify(value));
        _username.name = value.name ;
        _username.age = value.age ;

    }

    return {username, setUsername};

})

接下来在组件中使用:

这里是通过点击来模拟修改对象的name,age属性值

<script setup lang="ts">
  import {useHomeStore} from "@/stores/home";
  import {storeToRefs} from "pinia";
  import {onMounted} from "vue";

  //不能直接解构,需要使用storeToRefs方法
  const {username} = storeToRefs(useHomeStore());
  const {setUsername} = useHomeStore()

  const fn = ()=>{
    setUsername({
      name:"嘿嘿",
      age:51
    })
  }

  onMounted(()=>{
    const uname = sessionStorage.getItem("username");
    console.log("store", uname)
    if(uname){
      setUsername(JSON.parse(uname));
    }
  })
</script>

<template>
  <div>pinia测试</div>
  <div>{{username.name}}</div>
  <div>{{username.age}}</div>
  <div @click = "fn">点击修改</div>
</template>

<style scoped>

</style>

因为我是使用了pinia所有在开发者工具中可以看到修改后的值:

至此一切的工作都很顺利,达到了预期。因为这是一个单页面应用,如果你刷新了页面,就会发现pinia中的数据不见了。如果当前数据保存的是用的登录状态,那么用户就直接退出了。这显然不合理。需要对pinia中保存的数据进行持久化处理。于是找到pinia-plugin-persistedstate这款数据持久化工具,这款工具一搜就很多的介绍还有很多配置教程。

一开始我也想通过这款插件来实现数据的持久化,毕竟有插件可以更方便。但是,我竟然折腾了一个下午都没有配置成功。后来。。。后来。。。干脆自己写sessionStorage实现,反而更快。还记得这份代码中这一句灰色注释掉的代码吗?没错实现数据持久化就这么简单,一句代码搞定。虽然没明白为啥pinia-plugin-persistedstate没有配置成功,有可能是软件版本的原因,不过也没有关系自己实现也很简单。

如果有小伙伴跟我一样搞了好久都没有将pinia-plugin-persistedstate配置成功,那么别浪费时间,自己写也很简单。因为在浏览器实现数据的持久化本质上也是将数据保存在localstorage里面,自己实现就好。

最近有点忙,这段时间的文章也更新的断断续续的。加油!目前给自己定的目标今年是一款PC端的产品,2款安卓APP保持持续性的更新迭代。


------------------ 华丽分割线 ------------------
欢迎大家阅读我的创业笔记,如果你觉得这篇写得不错的话,可以关注我的公众号: 成长创业笔记 第一时间查阅我们的文章!感谢大家的支持。
我是一名独立开发者,创业者。欢迎大家跟我交流软件开发、软件运营的一切事情。 包括网站建设、小程序开发、安卓app开发等。
微信号:zstxinghui
欢迎大家使用我们的软件:
  • ● 在线图片编辑器
  • ● 小程序: 家政小程序,陪诊小程序
  • ● 开源的网站内容管理系统: 小木CMS内容管理系统
更欢迎大家下载我们的APP:
  • ● 松鼠天气:简洁的天气预报,日历工具
公众号
程序员小张
我们的主营业务:承接网站建设小程序开发安卓APP开发软著申请等。欢迎咨询!
扫一扫,加我微信
随机文章
人人都是自媒体的时代
2024-06-12 15:16:17
uniapp使用vue3实现tab切换效果
2024-07-27 14:36:05
tp6自定义模版标签
2024-10-12 10:13:59
开发者周记13 一步一个脚印见证未来
2024-11-15 09:51:24
成长创业周记14:小程序管理后台开发
2024-11-23 17:15:47