vue3中pinia的使用及持久化(详细解释)

解释一下pinia:

Pinia是一个基于Vue3的状态管理库,它提供了类似Vuex的功能,但是更加轻量化和简单易用。Pinia的核心思想是将所有状态存储在单个store中,并且将store的行为和数据暴露为可响应的API,从而实现数据(或方法)在各个组件之间的共享和修改;

1、新建一个vue3项目,并导入pinia的依赖:

npm install pinia

2、在main.ts中引入pinia:

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'

const app = createApp(App)

const pinia = createPinia()
app.use(pinia)
app.use(router)

app.mount('#app')

3、在src目录下,新建一个stores文件夹。我们在这个文件夹中进行pinia的使用;

新建一个counter.ts文件,在这个文件中定义一个变量count,使这个count变量能被所有的组件共享,并修改其值;

countrt.ts的代码如下:

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

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
// 定义一个方法,直接清空count
const clearCount = () => {
count.value=0
}

  return { count,clearCount}
})

解释一下:

defineStore :是pinia使用中必须要引入的一个函数,它是用于定义一个新的store的函数。

在Pinia中,每个store都需要使用defineStore函数进行定义,并传入一个配置对象来描述store的行为和数据。

defineStore 一般要传递两个参数,第一个是store函数的名称,一般这个名称要做到见名知义、第二个是这个store函数的具体逻辑。

可以在这里面定义属性、方法等。但是这些定义过的属性和方法一定要通过return交出去才行

如上图,我们顶义一个count变量,并通过return返回了出去。那么现在就可以在任意组件中查看count的值,并进行修改了。

4、使用pinia:

要在组件中使用pinia定义的store函数,第一步是要先引入store:


import { useCounterStore } from '@/stores/counter';

第二步,定义一个参数来接收这个useCounterStore函数:

const counterStore = useCounterStore();

第三步,直接在需要的位置引入counterStore中的参数即可

(可以是属性,也可以是方法。但是有一点要注意,就是必须要是return交出去的才可以;)

从pinia中取到的数据{{ counterStore.count }}

 <button @click="counterStore.clearCount">清空count</button>

属性或者方法都可以直接使用,只要你在return中交出去了

启动vue3项目,查看

可以看到确实能获取到pinia中定义的数据count;

如果想要修改count,可以直接在数值上修改:
 

const addCount = () => {

counterStore.count++;

}

定义一个按钮,并绑定事件:修改结果如图:

这个修改是全局的,你在另一个组件中也可以观察到pinia中数据的变化:

但是pinia有一个不好的地方就是它默认是内存存储,你只要一刷新浏览器就会丢失数据。

我们这时候可以借助pinia的持久化插件persist来解决;

1、下载persist持久化插件:

npm install pinia-plugin-persistedstate

2、在pinia中使用persist

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
// 1、pinia的持久化插件
import { createPersistedState } from 'pinia-plugin-persistedstate'

const app = createApp(App)

//2、 接收createPersistedState函数
const piniaPersistedState = createPersistedState()

const pinia = createPinia()
// 3、在pinia中引入持久化插件
pinia.use(piniaPersistedState)

app.use(pinia)
app.use(router)

app.mount('#app')

3、在定义状态store的时候指定持久化配置参数:{persist:true}

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

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
// 定义一个方法,直接清空count
const clearCount = () => {
count.value=0
}

  return { count,clearCount}
},
{persist: true}

)

引入了pinia的持久化插件之后,我们再刷新页面,那么piniade的store函数中的数据也就持久的保存了。

其实这个插件底层也是使用了localstorage,将数据存储到了浏览器中。

  • 42
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pinia 是一个基于 Vue3 的状态管理库,它本身并没有提供数据持久化的功能。不过可以借助其他库来实现数据持久化,比如 `localStorage`、`sessionStorage`、IndexedDB 等。 下面以 `localStorage` 为例,介绍如何在 Pinia 实现数据持久化。 首先需要安装 `@vueuse/core` 库: ``` npm install @vueuse/core ``` 然后,在创建 Pinia 实例之前,通过 `useStorage` 方法创建一个本地存储实例: ```javascript import { createPinia } from 'pinia' import { useStorage } from '@vueuse/core' const localStorage = useStorage('my-app') const pinia = createPinia() // 在创建 store 时,使用本地存储实例作为插件 pinia.use(({ store }) => { store.$subscribe((mutation) => { localStorage.setItem(mutation.type, JSON.stringify(mutation.payload)) }) }) ``` 在上面的代码,我们通过 `useStorage` 方法创建了一个名为 `my-app` 的本地存储实例,并在创建 Pinia 实例后,通过 `pinia.use` 方法将其作为插件使用。每次 state 发生变化时,我们将变化的内容以 JSON 格式保存到本地存储。 如果需要在应用初始化时将本地存储的数据还原到 state ,可以在 store 添加一个 `init` 方法: ```javascript const store = defineStore({ id: 'myStore', state: () => ({ count: 0 }), actions: { init() { Object.keys(localStorage).forEach((key) => { this.$patch({ [key]: JSON.parse(localStorage.getItem(key)) }) }) } } }) ``` 在 `init` 方法,我们遍历本地存储的所有 key,并将对应的 value 还原到 state 。 最后,在应用初始化时,可以调用 store 的 `init` 方法来还原数据: ```javascript createApp(App).use(pinia).mount('#app') // 在应用初始化时执行 store 的 init 方法 pinia.store.$init() ``` 这样,就可以实现 Pinia 的数据持久化了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张乔24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值