前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >香~来自己动手做一款基于Pinia的可持久化插件吧~

香~来自己动手做一款基于Pinia的可持久化插件吧~

作者头像
用户9078190
发布2022-10-28 19:11:58
4380
发布2022-10-28 19:11:58
举报
文章被收录于专栏:知码前端知码前端

01

前言

最近正在对AdminWork(naiveui)版本进行重构,这次重构可以说基本上是对框架的核心功能进行重写了一次。了解过AdminWork源码的小伙伴可能知道,在LayoutStore中有一个很大的全局响应式对象,当然这样做是没有问题的,可以随着项目的开发,这种模式可能显得不太好,不利于扩展和维护。

同时之前用 typescript 写的很多地方不太好,有很多冗余的代码和不合理的代码。这次也一并升级。

值得一说的是这次升级也给大家带来的了一款基于Pinia的可持久化插件。只需要简单的几个配置就可以让 state 进行本地化存储。

02

包含功能

先来看一下我们开发的这款插件有什么样的功能吧。

1、可以进行对 state 对象进行保存到 localStorage 或者 sessionStorage

2、可以把localStorage 或者 sessionStorage的数据恢复到 state对象中

3、可以进行禁用、启用

4、可以过滤某些不需要进行存储的字段

基本上功能也就这么多,虽然不太复杂,可是写好这些还是需要点耐心的。

下面我们先看一下数据类型:

代码语言:javascript
复制
interface PresistType<S, Store> {
  enable: boolean
  option: Partial<{
    key: string
    storage: 'local' | 'session'
    include: (keyof S)[]
    exclude: (keyof S)[]
  }>
  resetToState?: ((store: Store) => void) | boolean
}

为了能更好的适配 typescript ,所以如果想要让 Pinia 认识我们自定义的选项,还需要进行声明,如下:

代码语言:javascript
复制
declare module 'pinia' {
  export interface DefineStoreOptionsBase<S, Store> {
    presist?: Partial<PresistType<S, Store>>
  }
}

03

详细说明

从上面的类型定义中我们可以看所定义的字段并不多,下面我们一一介绍下各字段具体是什么含义。

  • enable

类型:boolean

默认:false

说明:该选项默认值是false,也就是说需要你显示的指定为 true,才会开启对某个Store的持久化功能。

  • option

类型:object

默认:undefined

说明:该选项包含着一系列其它选项,没有实际意义,具体看里面的选项

  • option.key

类型:string

默认值:某store中的id

说明:该选项可以指定缓存的键名,如localStore.set(key, xxxx),如果不指定默认值就是当然定义 store的 id名称

  • option.storage

类型:'local' | 'session'

默认值:'local'

说明:该选项只能指定 'local' | 'session' 其中的一种,可以指定是用哪种方式进行存储,如常用的 localStoreag 和 sessionStorage

  • option.include

类型:(keyof S)[]

默认:undefined

说明:该选项可以指定需要存储的哪些字段,不指定则是存储全部字段

  • option.exclude

类型:(keyof S)[]

默认:undefined

说明:该选项可以指定需要排队存储的哪些字段,不指定则是存储全部字段

  • resetToState

类型:((store:Store)=>void) |boolean

默认:undefined

说明:该选项可以指定是否需要从持久化中恢复数据到state中,如果是函数类型,则意味着自己指定恢复过程。

04

使用

1、安装使用:

由于我们并没有把插件托管到 npm 中,所以这里无需安装,直接把源码放到本地,然后进行使用

代码语言:javascript
复制
import { createPinia } from 'pinia'
import PersistPlugin from './plugin/persist'

const pinia = createPinia()
pinia.use(PersistPlugin)

export default pinia

2、在某个Store中使用

代码语言:javascript
复制
const useUserStore = defineStore('user-info', {
  state: () => {
    return {
      userId: 0,
      roleId: 0,
      token: '',
      userName: '',
      nickName: '',
      avatar: defaultAvatar,
    }
  },
  // 下面的选项是我们的具体配置
  presist: {
    enable: true,
    resetToState: true,
    option: {
      exclude: ['userName'],
    },
  },
})

使用起来还是比较简单的

最后说一下具体源码的获取方式,可以从github 或者 gitee 上下载AdminWork的 dev 分支,然后找到 src/store/plugin下面的文件。以后会放到npm上,方便下载使用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知码前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 包含功能
  • 详细说明
  • 使用
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档