vue3 中使用pinia,实现持久化存储

文章对比了Vuex和Pinia两种Vue.js的状态管理工具,指出Pinia在没有mutations、模块化处理、TypeScript支持、代码自动拆分以及更小体积和更好性能方面的优势。同时,通过示例展示了Pinia的安装、创建store、在组件中使用以及模块划分的方法,并提到了Pinia的持久化存储配置。
摘要由CSDN通过智能技术生成

vuex与pinia对比

  1. 都支持选项式API和组合式API
  2. pinia没有mutations,只有:state,getters,actions
  3. pinia分模块不需要modules
  4. pinia的TS支持很好
  5. pinia可以自动化拆分代码
  6. pinia的体积更小,性能更好
  7. pinia可以直接修改数据,使用storeToRefs,直接修改pinia的值, vuex需要在计算属性中才能修改

pinia使用

安装:

npm i pinia

在main.ts中引入

import { createApp } from 'vue';
//挂载在app上
createApp(App).use(router).use(createPinia()).mount('#app');

新建store文件夹,新建index.ts

import { defineStore } from 'pinia';
export const userStore = defineStore('storeId', {
  state: () => {
    return {
      num: 17,
      age: '48',
      name: '苦哈哈',
    };
  },
  getters: {
    changeNum() {
      return this.num + 10;
    },
  },
  // 同步和异步都可以写
  actions: {
    upNum(val) {
      this.num += val;
    },
  },
});

在文件中使用

<template>
  <div>
    <h1>pinia</h1>
    <span>getters:{{ changeNum }}</span>
    <div
      ><h1>{{ num }}</h1></div
    ><div
      ><h1>{{ name }}</h1></div
    ><div
      ><h1>{{ age }}</h1></div
    >
    <div><button @click="changePinia">修改pinia值</button></div>
    <div><button @click="changeActions">修改actions值</button></div>
  </div>
</template>

<script setup>
  // 解构pinia的值,可变成响应式的值
  import { storeToRefs } from 'pinia';
  import { userStore } from './store/index';
  const store = userStore();
  // 解构
  let { name, num, age, changeNum } = storeToRefs(store);
  const changePinia = () => {
    name.value = '垃圾桶';
    // 批量更新
    store.$patch((state) => {
      state.name = 'ooooooo';
    });
  };
  const changeActions = () => {
    store.upNum(20);
  };
</script>

<style></style>

模块划分

pinia可以根据名称直接划分模块,不需要借助modules
新建user.ts,shop.ts

import { defineStore } from 'pinia';
export const user = defineStore('user', {
  state: () => {
    return {
      username: 'Admin',
    };
  },
  getters: {
    changeNum() {
      return this.username + '今天是周三';
    },
  },
  actions: {
    changeUsername(val){
      this.username = val
    }
  },
});

import { defineStore } from 'pinia';
export const shop = defineStore('shop', {
  state: () => {
    return {
      goods: ['鞋子', '珠宝', '包包'],
      akf: '0000000',
    };
  },
  getters: {
    changeGoods() {},
  },
  actions: {
    changeCoodsname() {},
  },
});

在文件中使用

<template>
  <div>
    <h1>pinia模块{{ username }}</h1>
    <span>getters:{{ changeNum }}</span>

    <div><button @click="changePinia">修改pinia值</button></div>
    <div><button @click="changeUsername">修改userName值</button></div>
    <hr />
    <h1>GOODS-----{{ akf }}</h1>
    {{ goods }}
  </div>
</template>

<script setup>
  // 解构pinia的值,可变成响应式的值
  import { storeToRefs } from 'pinia';
  import { user } from '../store/user';
  import { shop } from '../store/shop';
  const store = user();
  const GOODS = shop();
  // 解构
  let { username, changeNum } = storeToRefs(store);
  let { goods, akf } = storeToRefs(GOODS);
  const changePinia = () => {
    username.value = '垃圾桶';
    // 批量更新
    store.$patch((state) => {
      state.name = 'ooooooo';
    });
  };
  const changeUsername = () => {
    store.changeUsername('百事从欢');
  };
</script>

<style></style>

pinia持久化

npm i  pinia-plugin-persistedstate -S

在main.ts中引用

import piniaStore from './store';
createApp(App).use(router).use(piniaStore).mount('#app');

index.ts

import { createPinia } from 'pinia';
import { useAppStore } from './modules/app';
import { useUserStore } from './modules/user';

import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

export { useAppStore, useUserStore };
export default pinia;

app.ts

import { createPinia } from 'pinia';
import { useAppStore } from './modules/app';
import { useUserStore } from './modules/user';
//引入持久化
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
//使用插件
export { useAppStore, useUserStore };
export default pinia;

在模块中开启缓存

import { defineStore } from 'pinia';
import piniaStore from '/@/store/index';

export const useAppStore = defineStore(
  // 唯一ID
  'app',
  {
    state: () => ({
      title: 'FastVue3,一个快速开箱即用的Vue3+Vite模板',
    }),
    getters: {},
    actions: { },
    //配置缓存
    persist: {
      key: 'theme',
      //存储在localstorage还是sessionStorage中
      storage: localStorage,
      //哪个数据需要持久化
      paths: ['theme'],
    },
  },
);
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,Pinia是一个状态管理库,它提供了一种简单而强大的方式来管理应用程序的状态。关于Pinia的持久化实现,可以通过以下步骤来实现: 1. 安装依赖:首先,你需要安装`@pinia/persist`插件,它是Pinia提供的用于持久化的插件。你可以使用npm或者yarn进行安装。 2. 创建插件:在你的Vue项目,创建一个名为`persist.ts`(或者其他你喜欢的名称)的文件,并在其编写以下代码: ```typescript import { createPersist } from '@pinia/persist' // 创建持久化插件 export const persistPlugin = createPersist({ // 指定要持久化的状态模块 // 这里假设你有一个名为counter的状态模块 // 如果有多个模块需要持久化,可以在这里添加多个模块 // modules: ['counter'] }) // 在Vue应用程序使用插件 // 在创建Pinia实例之前调用usePlugin方法 // 例如,在main.ts文件: // import { createApp } from 'vue' // import { createPinia } from 'pinia' // import { persistPlugin } from './persist' // const app = createApp(App) // const pinia = createPinia() // pinia.use(persistPlugin) // app.use(pinia) ``` 3. 配置持久化选项:在`createPersist`方法,你可以传递一些选项来配置持久化行为。例如,你可以指定存储引擎(如localStorage或sessionStorage)、存储键的前缀等。具体的选项可以参考Pinia Persist的文档。 4. 使用持久化:在需要进行持久化的状态模块,你可以使用`persist`选项来指定哪些状态需要进行持久化。例如,在`counter`状态模块: ```typescript import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0, }), actions: { increment() { this.count++ }, }, // 指定需要持久化的状态 persist: true, }) ``` 这样,当你在应用程序使用`useCounterStore`时,`count`状态将会被自动持久化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值