首页 > 其他分享 >前端开发避坑--在组件外使用 pinia 实例的同时,避免持久化无效

前端开发避坑--在组件外使用 pinia 实例的同时,避免持久化无效

时间:2022-12-09 21:12:23浏览次数:70  
标签:持久 pinia -- 创建 避坑 实例 模块 i18n

简介

pinia 官网介绍了在组件外使用 pinia 实例的方式并不适用于所有场景,只是希望开发者能在实例创建好并注册到 app 实例后再使用 use*Store 获取对应仓库的实例。

这是链接:https://pinia.vuejs.org/zh/core-concepts/outside-component-usage.html#single-page-applications

需求说明

我的需求是在创建 i18n 实例前,先判定本地是否有持久化的语言状态,没有时才取项目的默认语言。同时,为了规范在项目中使用 i18n 获取各组件独立的以及通用的文本,还需要导出创建好的 i18n 实例给对应的模块。

问题分析

一开始使用了这个链接提到的方法,在 /store 目录下新建了一个方便获取的函数:

import { store } from './index';

const getStoreOutsideVue = (useStoreHook) => useStoreHook(store);
export default getStoreOutsideVue;

然后,在 i18n 的初始化模块中,引入该函数以及保存语言状态的仓库 useLocaleStore 并调用。

重新生成的页面确实能获取到持久化状态了,但一刷新就发现持久化状态不再更新了。检查后发现其他没有被 i18n 引入的仓库都正常,说明问题是出在了这里的 getStoreOutsideVue 调用上。

查资料后,看到有种说法是 当项目中存在多个 Pinia 实例时,持久化可能会失效。虽然不确定这里是否确实是这个原因,但该问题确实暂时解决不了,因此重新回到官网的建议上。

分析我的需求,区别在于原先的 i18n 实例初始化逻辑中,有一个 setupI18nConfigs 函数,该函数会在 i18n 模块中直接调用并将结果传递给 createI18n 函数,因此项目中的 i18n 实例是在该模块中同步创建的。在这种方式下,我无法确保 i18n 实例的创建过程必定在 pinia 实例的注册过程之后。

因此,考虑是否能调整初始化逻辑的时间。

由于 i18n 模块以及其他模块的注册过程是参考了 vben-admin 的源码,因此,尝试到该项目中寻找解决方案,也确实找到了,而且挺简单的。

vben-admin 的思路是先创建一个空的 i18n 变量,然后在 setupI18n 函数中再去调用 setupI18nConfigs 以及 createI18n 创建实例并赋值。这样,全局仍然只有一个 i18n 实例,同时,又能确保该实例的初始化过程在 pinia 实例注册之后执行。

总结

需求本身并不复杂,解决的措施也很简单,但还是花了一些时间才从其他人的思路中得到启发。

写 vue3 大部分时候用到的都是 const 声明的变量,产生了下意识的依赖,不太敢用 let 关键字了,怕一不小心修改了代理对象的引用导致丢失响应性。

总结一句话,还是需要多看优质源码,学习他人的思路,突破自身思维的局限性。

标签:持久,pinia,--,创建,避坑,实例,模块,i18n
From: https://www.cnblogs.com/cjc-0313/p/16970006.html

相关文章

  • 数的三次方根
    数的三次方根给定一个浮点数n,求它的三次方根。输入格式共一行,包含一个浮点数n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。数据范围\(......
  • 题解 CF1713F【Lost Array】
    首先,为了方便将第\(1\)行的数从右往左重标号为\(0,1,\cdots,n-1\)。我们发现\((1,i)\)对于\((j,n+1)\)的贡献是\(C(i+j,i)\pmod2\),根据\(\text{lucas}......
  • Git安装及环境配置
    软件下载打开Git官网https://git-scm.com/,下载git对应操作系统版本官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/ ......
  • ahk autohotkey脚本 备份
    #NoEnv;RecommendedforperformanceandcompatibilitywithfutureAutoHotkeyreleases.;#Warn;Enablewarningstoassistwithdetectingcommonerrors.Se......
  • Windows,C++编程创建窗口的过程详解
    MFC创建窗口一般要经历以下四个操作步骤:(1)   定义窗口类主要指定窗口类的一些基本且必须指定的特征,窗口类的特征主要是由WNDCLASS结构体来定义的,WNDCLASS的定义如下:type......
  • SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High Availability)?...
    如何保证服务的高可用性HA(HighAvailability)?高可用HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论......
  • 《动手学ROS2》9.3为FishBot配置两轮差速控制插件
    《动手学ROS2》9.3为FishBot配置两轮差速控制插件本系列教程作者:小鱼公众号:鱼香ROSQQ交流群:139707339教学视频地址:小鱼的B站​完整文档地址:鱼香ROS官网版权声明:如非允......
  • 《动手学ROS2》9.2为机器人URDF模型注入物理属性并在Gazebo中显示
    《动手学ROS2》9.2为机器人URDF模型注入物理属性并在Gazebo中显示本系列教程作者:小鱼公众号:鱼香ROSQQ交流群:139707339教学视频地址:小鱼的B站​完整文档地址:鱼香ROS官网......
  • 《动手学》9.1 机器人仿真介绍
    《动手学》9.1机器人仿真介绍本系列教程作者:小鱼公众号:鱼香ROSQQ交流群:139707339教学视频地址:小鱼的B站​完整文档地址:鱼香ROS官网版权声明:如非允许禁止转载与商业用......
  • 《动手学ROS2》10.4 Cartographer介绍与安装
    《动手学ROS2》10.4Cartographer介绍与安装本系列教程作者:小鱼公众号:鱼香ROSQQ交流群:139707339教学视频地址:小鱼的B站​完整文档地址:鱼香ROS官网版权声明:如非允许禁止......