Pinia+Vue3使用案例及Pinia持久化存储

本文介绍Vue.js的状态管理库Pinia的使用方法,包括其优势、安装步骤及如何配置持久化存储,适合希望优化Vue应用状态管理的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要使用Pinia

Pinia是Vue的一个存储库,它允许你跨组件/页面共享状态。 如果你熟悉Composition API,你可能会认为你已经可以通过一个简单的导出const state = reactive({})来共享一个全局状态。 这对于单页应用程序是正确的,但如果是服务器端呈现,则会暴露应用程序的安全漏洞。 但即使是在小的单页应用程序中,你也可以通过使用Pinia获得很多:

  • 热模块替换
  • 修改存储而无需重新加载页面
  • 在开发过程中保持任何现有状态
  • 使用插件扩展Pinia功能
  • 为JS用户提供正确的TypeScript支持或自动补全
  • 服务器端渲染支持

安装

 npm install pinia

配置

新建sotre仓库
index.ts
import type { App } from "vue";
import { createPinia } from "pinia";

const store = createPinia();

export function setupStore(app: App<Element>) {
  app.use(store);
}

export { store };

以premession.ts模块为例
import { defineStore } from "pinia";
import { store } from "../index";

export const usePermissionStore = defineStore({
  id: "pure-permission",
  state: () => ({
    // 静态路由生成的菜单
    name: "permission",
    linkId: 0,
    // 整体路由生成的菜单(静态、动态)
    wholeMenus: [],
    // 深拷贝一个菜单树,与导航菜单不突出
    menusTree: [],
    buttonAuth: [],
    // 缓存页面keepAlive
    cachePageList: [],
  }),
  actions: {},
});

export function usePermissionStoreHook() {
  return usePermissionStore(store);
}

main.ts引入store

在这里插入图片描述

使用案例

<template>
  <div class="RelationGraph">
    <div>{{ num }}</div>
    <div class="addNum"></div>
    <el-button color="#626aef" @click="clickHandler">Default</el-button>
  </div>
</template>

<script lang="ts" setup>
import { ElButton } from "element-plus";
import { usePermissionStoreHook } from "../../store/modules/premession";
import { ref } from "vue";
const num = ref<number>(0);
const clickHandler = () => {
  num.value++;
  usePermissionStoreHook().$state.linkId = num.value;
  console.log(
    "store:",
    usePermissionStoreHook().$state.linkId,
    "num:",
    num.value
  );
};
</script>

<style scoped lang="less">
.RelationGraph {
  padding-top: 160px;
}
</style>

页面刷新后,数据会重置,安装类似vuex- persistdstate的pinia插件解决。

存储状态并持久化存储

安装 pinia-persistedstate-plugin
npm install pinia-persistedstate-plugin
store>index.ts
import type { App } from "vue";
import { createPinia } from "pinia";

import { createPersistedState } from "pinia-persistedstate-plugin";
const store = createPinia();
store.use(createPersistedState());
export function setupStore(app: App<Element>) {
  app.use(store);
}

export { store };

二次刷新,数据用以持久化存储。

<think>好的,我现在需要帮助用户解决如何集成Vite6、Vue3Piniavue-i18n的问题。首先,我需要回顾一下之前用户提供的引用内容,看看有没有相关的配置信息。 根据引用[1],用户提到了安装vue-i18n的方法,即在项目中运行`cnpm install vue-i18n --save`,然后在src目录下创建language文件夹和相关文件。这可能涉及到基本的vue-i18n配置步骤。接下来,引用[2]提到在Vue3+vite项目中优化国际化配置,包括测试中英文切换和对ElementPlus组件的支持。这说明可能需要配置ElementPlus的国际化,以及如何在页面中使用i18n。引用[3]则涉及Pinia持久化插件问题,用户之前遇到了报错,后来改用pinia-plugin-persistedstate。因此,在配置Pinia时需要正确安装该插件,并注意与Vue版本的兼容性。 现在,我需要将这些信息整合成一个步骤清晰的教程。首先,项目初始化使用Vite6创建Vue3项目。然后安装必要的依赖:Vue3本身、Pinia及其持久化插件、vue-i18n。接下来,配置Pinia,包括持久化插件的引入。之后是配置vue-i18n,包括创建语言文件、初始化实例,并在Vue应用中注册。可能还需要处理ElementPlus的国际化,根据引用[2]的内容,这部分可能需要额外配置。最后,如何在组件中使用这些库,比如使用Pinia的store和i18n的翻译函数。 需要注意的潜在问题包括:依赖版本兼容性,比如确保vue-i18n和Vue3的版本匹配,Pinia插件是否正确安装。此外,ElementPlus的国际化可能需要单独引入中英文语言包,并在i18n实例中合并配置。可能还需要在main.ts中正确导入和配置各个插件,避免遗漏步骤导致运行时错误。 用户可能需要一个完整的配置示例,包括代码片段和文件结构说明。例如,language文件夹下的index.ts、zh-CN.ts、en-US.ts等文件的结构。还有在组件中如何使用$t函数进行翻译,以及如何在Pinia store中使用持久化功能。 最后,根据用户的要求,生成相关问题,可能涉及配置中的常见问题、优化技巧,或如何扩展功能,比如动态加载语言包或处理异步数据。需要确保问题覆盖用户可能遇到的后续疑问,帮助他们深入理解和应用这些技术栈。</think>### Vite6 + Vue3 + Pinia + vue-i18n 集成配置教程 #### 一、项目初始化 1. 创建Vite6项目 ```bash npm create vite@6 my-project -- --template vue cd my-project ``` #### 二、安装核心依赖 ```bash npm install vue-i18n@9 pinia pinia-plugin-persistedstate ``` 注:`vue-i18n@9` 专为Vue3设计,`pinia-plugin-persistedstate` 是持久化存储推荐插件[^3] #### 三、Pinia配置 1. 创建Store实例 ```typescript // src/stores/index.ts import { createPinia } from &#39;pinia&#39; import piniaPluginPersistedstate from &#39;pinia-plugin-persistedstate&#39; const pinia = createPinia() pinia.use(piniaPluginPersistedstate) export default pinia ``` 2. 在main.ts挂载 ```typescript // src/main.ts import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import pinia from &#39;./stores&#39; const app = createApp(App) app.use(pinia) app.mount(&#39;#app&#39;) ``` #### 四、vue-i18n配置 1. 创建语言文件 ```typescript // src/language/zh-CN.ts export default { message: { hello: &#39;你好世界&#39;, button: &#39;点击我&#39; } } ``` ```typescript // src/language/en-US.ts export default { message: { hello: &#39;Hello World&#39;, button: &#39;Click Me&#39; } } ``` 2. 初始化i18n实例 ```typescript // src/language/index.ts import { createI18n } from &#39;vue-i18n&#39; import zhCN from &#39;./zh-CN&#39; import enUS from &#39;./en-US&#39; const i18n = createI18n({ legacy: false, // 必须关闭传统模式[^2] locale: &#39;zh-CN&#39;, messages: { &#39;zh-CN&#39;: zhCN, &#39;en-US&#39;: enUS } }) export default i18n ``` 3. 挂载到Vue实例 ```typescript // src/main.ts import i18n from &#39;./language&#39; app.use(i18n) ``` #### 五、ElementPlus国际化(可选) ```typescript import ElementPlus from &#39;element-plus&#39; import zhCn from &#39;element-plus/dist/locale/zh-cn.mjs&#39; import en from &#39;element-plus/dist/locale/en.mjs&#39; app.use(ElementPlus, { locale: i18n.global.locale.value === &#39;zh-CN&#39; ? zhCn : en }) ``` #### 六、组件中使用示例 ```vue <script setup> import { useI18n } from &#39;vue-i18n&#39; import { useUserStore } from &#39;@/stores/user&#39; const { t } = useI18n() const userStore = useUserStore() </script> <template> <h1>{{ t(&#39;message.hello&#39;) }}</h1> <el-button>{{ t(&#39;message.button&#39;) }}</el-button> </template> ``` #### 七、运行验证 ```bash npm run dev ``` §§ 相关问题 §§ 1. 如何实现语言切换的动态加载? 2. 如何处理国际化资源的异步加载? 3. Pinia持久化存储有哪些配置选项? 4. 如何解决ElementPlus组件与自定义翻译的冲突? 5. 多模块Store如何组织更合理? [^1]: 引用安装vue-i18n的基本方法 : 参考Vue3+vite国际化优化实践 : 来自Pinia持久化插件的版本适配经验
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值