持久化pinia状态

持久化 pinia 状态

在实际开发中,当浏览器刷新时,有些数据就会被初始化,但是我们希望将一些数据保存下来。如用户登录后,用户信息会存储在全局状态中,如果不持久化状态,那么每次刷新用户都需要重新登录了。

解决这个问题有很多种方法,在状态改变时将其同步到浏览器的存储中,如 cookielocalStoragesessionStorage 。每次初始化状态时从存储中去获取初始值即可。

但是这里我们用到pinia,我们可以用pinia 的插件 pinia-plugin-persistedstate 来实现。

安装

pnpm : pnpm install pinia-plugin-persistedstate
npm : npm install pinia-plugin-persistedstate
yarn : yarn add pinia-plugin-persistedstate

我们将之前引入的pinia做一些调整,并且模块化我们的store

store/index.js中实例化pinia,并且插入pinia-plugin-persistedstate ,导出pinia

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()

pinia.use(piniaPluginPersistedstate)

export default pinia

store/module目录下写我们的store模块。

在需要持久化状态的模块中设置 persistdefineStore 第一个参数定义唯一的模块名,第二个参数传递 storeSetup,其实还有第三个参数 options,在 options 中便可开启 persist

export const useCommonStore = defineStore('common',{
    state() => {
        return {
            // 定义一个是否展开的字段isCollapse
            isCollapsefalse
        }
    },
    getters: {
        
    },
    actions: {
       
    },
    persisttrue
})
  • persist

persist 支持多种类型的值,最简单的就是传递 true,此时会将状态缓存localStorage 中,该 localStoragekey 为模块名(defineStore 的第一个参数),value 为该模块的状态对象。

持久化pinia状态如果需要将其存储在 sessionStorage 中,就需要设置 persist 的值为一个对象:

export const useCommonStore = defineStore('common',{
    state() => {
        return {
            // 定义一个是否展开的字段isCollapse
            isCollapsefalse,
            counter1,
        }
    },
    getters: {
        
    },
    actions: {
       increment() {
            this.counter++
        },
    },
   // 将其存储在 `sessionStorage` 中
    persist: {
        key'all',
        storage: sessionStorage
    },
    // 可以通过为属性指定选项来配置持久化方式persist
   // persist: {
    //     paths: ['isCollapse'],
    //     storage: sessionStorage
    // },
}
})

在路由守卫中使用状态

我们知道了如何在组件中使用状态值,那么在全局路由守卫中如何获取状态值。

我们看一下官网给的这个使用 Vue Router 的导航守卫内部的 store 的例子就是知道了:

import { createRouter } from 'vue-router'
const router = createRouter({
  // ...
})

// ❌ 根据导入的顺序,这将失败
const store = useStore()

router.beforeEach((to, from, next) => {
  // 我们想在这里使用 store 
  if (store.isLoggedIn) next()
  else next('/login')
})

router.beforeEach((to) => {
  // ✅ 这将起作用,因为路由器在之后开始导航
   // 路由已安装,pinia 也将安装
  const store = useStore()

  if (to.meta.requiresAuth && !store.isLoggedIn) return '/login'
})

在钩子函数外,pinia 还没有被挂载,但是在前置守卫函数中,pinia 已经被挂载了,所以获取全局状态,需要在钩子函数中进行。

观看更多相关文章请关注公众号:

持久化pinia状态
前端编程.jpg


原文始发于微信公众号(大前端编程教学):持久化pinia状态

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/224257.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!