自学内容网 自学内容网

Vue3+Pinia 状态管理持久化

一、Pinia 简介

🎖️Pinia 起始于 2019 年 11 月左右的一次实验,其目的是设计一个拥有组合式 API 的 Vue 状态管理库。Vue3+Vite+Pinia 新三剑客逐渐替代了Vue2+Webpack+Vuex 了,性能啥的各方面吊打。

1.1 什么是状态管理?

🎯全局状态 Store  (如Vuex、 Pinia) 是一个保存状态和业务逻辑的实体,与组件树没有绑定,有点像一个永远存在的组件,每个组件都可以读取和写入它。

1.2 状态管理三大核心概念

  • 🥇state 属性 —— 相当于组件中的 data 
  • 🥈getter 计算属性 —— 相当于组件中的 computed 
  • 🥉action 操作属性的行为 —— 相当于组件中的 methods 

1.3 什么时候使用 Store?

Store (如 Pinia) 是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。它有三个概念stategetter 和 action,我们可以假设这些概念相当于组件中的 data、 computed 和 methods 

1.4 应该在什么时候使用 Store?

一个 Store 应该包含可以在整个应用中访问的数据。这包括在许多地方使用的数据,例如显示在导航栏中的用户信息,以及需要通过页面保存的数据,例如一个非常复杂的多步骤表单。

另一方面,你应该避免在 Store 中引入那些原本可以在组件中保存的本地数据,例如,一个元素在页面中的可见性。

并非所有的应用都需要访问全局状态,但如果你的应用确实需要一个全局状态,那 Pinia 将使你的开发过程更轻松。

1.5 什么时候应该使用 Store?

有的时候我们会过度使用 store 。如果觉得应用程序的 store 过多,你可能需要重新考虑使用 store 的目的。例如其中一些逻辑应该只是组合式函数,或者应该只是组件的本地状态。这在 Mastering Pinia 的 (不要) 滥用 store 课程中有详细介绍。

1.6 为什么你应该使用 Pinia?

Pinia Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export const state = reactive({}) 来共享一个全局状态。

二、状态持久化(避免刷新页面后状态丢失)

2.1  安装插件 pinia-plugin-persistedstate

npm i pinia-plugin-persistedstate

2.2 导入启用

📌 在 src/main.ts 文件配置

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

const pinia = createPinia()

pinia.use(
  createPersistedState({
    // 所有 Store 都开启持久化存储
    auto: true
  })
)
app.use(pinia)
 

2.3 配置关闭持久化

 🔌 针对需要关闭持久化的 store ,添加配置

{
    persist: false
}

 详细范例如下: src/stores/counter.ts 

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'

export const useCounterStore = defineStore(
  'counter',
  () => {
    const count = ref(0)
    const doubleCount = computed(() => count.value * 2)
    function increment() {
      count.value++
    }

    return { count, doubleCount, increment }
  },
  // 关闭持久化
  {
    persist: false
  }
)

当然,也可以默认全局不启用持久化

// src/main.ts 中
pinia.use(
  createPersistedState({
    auto: false
  })
)

只针对部分 store 开启持久化

// 开启持久化(目标 store 中)
  {
    persist: true
  }

2.4 自定义持久化

如果你想要自定义持久化的行为,比如指定要持久化哪些状态或者使用其他存储方式(如IndexedDB),你可以在创建 pinia 时传递配置:

// store.js
import { createPinia } from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'
 
const pinia = createPinia()
 
pinia.use(piniaPluginPersist({
  storage: localStorage, // 默认为localStorage,你也可以使用sessionStorage或其他
  paths: ['myStoreName'], // 指定要持久化的store
  ttl: 60 * 60 * 24, // 数据存活时间(秒),默认为一天
}))
 
export default pinia

这样,你就可以在Vue 3应用中使用Pinia来管理状态,并且这些状态将自动保存和恢复。



原文地址:https://blog.csdn.net/mss359681091/article/details/144353223

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!