vue3.0 安装使用pinia 以及pinia的持久化

1.下载依赖

npm install pinia

2.在src下面创建store/index.ts文件

import { createPinia } from "pinia";

// 创建
const pinia = createPinia();

// 导出
export default pinia;

3.在src下面在创建store/useMyStore.ts文件

import { defineStore } from "pinia";
interface userFormType {
  user: string;
  id: string;
  age: string;
  sex: string;
}
interface State {
  userForm: userFormType;
}

export const useMyStore = defineStore("userForm", {
  state: (): State => ({
    userForm: {
      user: "",
      id: "",
      age: "",
      sex: "",
    },
    // 其他状态
  }),
  getters: {
    // 获取用户信息
    userInfo(): userFormType {
      return this.userForm;
    },
  },
  actions: {
    // 修改用户信息
    setUserInfo(data: userFormType) {
      this.userForm = data;
    },
  },
});

4. 修改main.ts 

5.页面基本使用

<template>
    <div class="p-4">
        <!-- 页面使用 -->
        <div>{{ useStore.userForm }}</div>
        <button @click="setStore">设置stroe</button>
        <button @click="getStore">获取stroe</button>
    </div>
</template>
<script setup lang="ts">
// 先导入
import { useMyStore } from "@/store/useMyStore";
// 实例化
const useStore = useMyStore()
// 设置数据
let setStore = () => {
    useStore.setUserInfo({
        user: "张三",
        id: "1",
        age: "18",
        sex: "男",
    });
};
// 获取数据
let getStore = () => {
    console.log(useStore.userInfo);
};
</script>
<style lang="scss"></style>

6.pinia的api方法 $subscribe $onAction监听修改

<template>
    <div class="p-4">
        <!-- 页面使用 -->
        <div>{{ useStore.userForm }}</div>
        <el-button @click="setStore">设置stroe</el-button>
        <el-button @click="getStore">获取stroe</el-button>
        <el-button @click="resetStore">重置stroe</el-button>
    </div>
</template>
<script setup lang="ts">
// 先导入
import { useMyStore } from "@/store/useMyStore";
// 实例化
const useStore = useMyStore()
// 设置数据
let setStore = () => {
    useStore.setUserInfo({
        user: "张三",
        id: "1",
        age: "18",
        sex: "男",
    });
};
// 获取数据
let getStore = () => {
    console.log(useStore.userInfo);
};
// 重置数据
let resetStore = () => {
    useStore.$reset();
};
// 用来监听state值改变
useStore.$subscribe((args, state) => {
    console.log('state值改变',args, state);
}, {
    detached: true,
    deep: true,
    flush: 'post'
});
// 用来监听action方法调用
useStore.$onAction((args) => {
    args.after(() => {
        console.log("action调用后");
    });
}, true);
</script>
<style lang="scss"></style>

7. pinia的持久化

7.1 下载依赖
npm i pinia-plugin-persistedstate
7.2 在初始化Pinia时,使用pinia-plugin-persistedstate插件来配置数据持久化
import { createPinia } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' //引入持久化插件
// 创建
const pinia = createPinia();

// 使用插件
pinia.use(piniaPluginPersistedstate);

// 导出
export default pinia;
7.3  持久化配置
import { defineStore } from "pinia";
interface userFormType {
  user: string;
  id: string;
  age: string;
  sex: string;
}
interface State {
  userForm: userFormType;
}

export const useMyStore = defineStore("userForm", {
  state: (): State => ({
    userForm: {
      user: "",
      id: "",
      age: "",
      sex: "",
    },
  }),
  getters: {
    // 获取用户信息
    userInfo(): userFormType {
      return this.userForm;
    },
  },
  actions: {
    // 修改用户信息
    setUserInfo(data: userFormType) {
      this.userForm = data;
    },
  },
  // persist:true, // 整个 Store 将使用默认持久化配置保存。
  persist: {
    key: "userForm", //存储名称
    storage: localStorage, // 存储方式
    paths: ["userForm"], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state
  },
});
Vue3 中,你可以利用 Pinia 的状态管理特性配合 `sessionStorage` 来实现数据的持久化存储。Pinia 提供了一种简洁的方式来组织和管理应用的状态,而 `sessionStorage` 则用于在浏览器会话之间保持数据。 以下是设置 `pinia` 状态到 `sessionStorage` 的基本步骤: 1. **安装并配置Pinia**: 首先确保已经安装Vue 3Pinia。如果还没有,可以使用Vue CLI创建一个新的项目,并在`main.js`中引入`pinia`库。 ```javascript import { createApp } from &#39;vue&#39;; import { useStore } from &#39;@pinia/core&#39;; import store from &#39;./store&#39;; const app = createApp(App); // 注册Pinia store app.use(store); ``` 2. **在Pinia store中保存数据**: 在 Pinia 的 store 中,你可以定义一个响应式的数据,然后在需要的时候将其设置到 `sessionStorage`。例如: ```javascript export default defineStore(&#39;myStore&#39;, { state() { return { myData: &#39;&#39;, }; }, actions: { saveToSession() { sessionStorage.setItem(&#39;myData&#39;, this.myData); }, loadFromSession() { this.myData = sessionStorage.getItem(&#39;myData&#39;) || &#39;&#39;; }, }, }); ``` 3. **使用数据时设置和加载**: 在组件内,初始化 store 并在适当的地方调用 `loadFromSession` 加载数据,然后在需要时调用 `saveToSession` 存储数据: ```javascript setup() { const store = useStore(&#39;myStore&#39;); onMounted(() => { store.loadFromSession(); }); onUnmounted(() => { store.saveToSession(); // 可选,通常在组件卸载时清除本地数据 }); function updateMyData(newData) { store.myData = newData; store.saveToSession(); } return { myData: store.myData, updateMyData }; } ``` 4. **安全性注意**: 请注意,虽然 `sessionStorage` 比较安全,但它还是暴露给客户端,所以敏感信息不应直接存入其中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值