pinia必看避坑指南:几行代码规避隐藏bug!非常重要!

简介: 【10月更文挑战第16天】pinia必看避坑指南:几行代码规避隐藏bug!非常重要!

需求描述

这几天开发,遇到一个很常见的需求:点击一个按钮,出现一个全局的表格;点击返回或者菜单按钮,表格消失,回到初始页面。

代码实现

代码的实现也很简单,首先在store中定义控制表格的显影状态listVisible

export const loopControlList = defineStore('loopControlList', {
   
    state: (): State => {
   
        return {
   
            listVisible: false,
        };
    },
    actions: {
   
        setVisible(value: boolean) {
   
            this.listVisible = value;
        },
    }
});

然后代码中引入,通过v-if控制显影

<template>
  <div>
    // 主应用
    <MainBox v-show="!loopListStore.listVisible" />
    // 表格组件
    <LoopModuleList v-if="loopListStore.listVisible" />
  </div>
</template>
  <script setup>
  import {
    loopControlList } from '@/store/loopControlList';
  const loopListStore = loopControlList();
</script>

代码实现非常简单,相信大家没有任何问题。

有的人可能会杠,这么简单的问题为什么要使用pinia?注意,这里我只是把复杂的业务简单化了,抽象成了方便大家理解问题的简答代码场景

问题描述

我们的架构是基于qiankun框架的,所有应用也都是通过子应用的方式接入框架的。当点击主应用的路由按钮时(下图照明按钮),会重新加载子应用的所有资源(network触发新的请求)。

但是,仔细看,当我点击【手动】按钮进入表格后,在点击主应用路由按钮【照明】后,就有问题了!

点击【照明】按钮,理论上子应用被重新加载,页面应该回到初始页面,但奇怪的是,居然直接进入了表格页面!

bug问题分析

出现这种问题,显然是一个bug,无非就是路由问题或者代码问题。很明显,路由的资源都被重新加载了,路由的问题概率不大,大概率是我们的代码问题。我们用了store进行了状态管理,先看一下store的值吧。

借助vue的调试工具,在没有打开表格页面前,store中的listVisible值是false没有问题。

我们打开表格,store中的listVisible值是true也没有问题

但是,当我们点击主应用的路由按钮重新加载子应用时,意外出现了!store中的listVisible值居然没有变化!

这就奇怪了!子应用的所有资源都被重新加载了,但是store中的值缺没有被初始化!居然还是页面注销前的状态值!

但如果我手动刷新页面,功能又会恢复正常!

看来bug的原因找到了:表格出现时,store中的listVisible值改成了true,当点击主应用的路由按钮时,虽然子应用被重载,但store中的listVisible值没变,导致点击路由时页面默认进入表格!

这么看来,store的状态值,会基于某种机制被浏览器缓存起来,除非强制刷新页面,否则这个状态值不会轻易改变!

如何解决

要规避这种问题,其实也非常简单,就是我们手动更改store中的值,比如在页面注销时,将值设为初始状态。

<template>
  <div>
    // 主应用
    <MainBox v-show="!loopListStore.listVisible" />
    // 表格组件
    <LoopModuleList v-if="loopListStore.listVisible" />
  </div>
</template>
  <script setup>
  import {
    loopControlList } from '@/store/loopControlList';
  const loopListStore = loopControlList();

  onBeforeUnmount(()=>{
   
      loopListStore.setVisible(false)
  })
</script>

这样做的话,就会完美解决问题

总结

在某些场景下,即使页面资源重新加载,store中的值也不会改变,而是维持着页面注销前的状态。因此,为了解决这个机制带来的可能异常,我们要养成良好的习惯,在页面注销时,进行store的销毁。

当然,至于为什么store的值在资源重载时没有改变,笔者也没有搞明白原理,希望各位大佬能答疑解惑!

相关文章
|
11月前
|
前端开发
hover后元素边框变粗,样式被挤压?一招帮你解决,快收藏备用!
【10月更文挑战第15天】hover后元素边框变粗,样式被挤压?一招帮你解决,快收藏备用!
192 14
hover后元素边框变粗,样式被挤压?一招帮你解决,快收藏备用!
|
8月前
|
存储 人工智能 搜索推荐
评测 | AI 剧本生成与动画创作
随着短视频行业的快速发展,内容的即时性和创意性备受关注。传统动画制作流程复杂、耗时且成本高,难以跟上热点话题的变化。阿里云的“AI剧本生成与动画创作”解决方案通过AI自动化生成剧本、插图和语音,借助云计算的强大算力,大幅提速创作流程,降低成本,帮助短视频内容更高效、更有创意地生产。 本文将详细介绍该解决方案的部署和实际体验,涵盖从注册阿里云账号、开通相关服务到部署应用的全过程,并分享使用感受。尽管部署简单直观,生成的动画效果目前仍存在不足,但在创意动画和快速生成方面已展现出一定潜力。未来,随着技术的不断优化,期待AI动画创作能带来更高质量的作品,推动行业创新和发展。
346 5
评测 | AI 剧本生成与动画创作
|
12月前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
2588 44
|
8月前
|
人工智能 Serverless API
评测|全网最强🚀!5min部署满血版DeepSeek,零成本,无需编程!
本文介绍了阿里云提供的四种DeepSeek部署方案,包括基于百炼调用满血版API、基于函数计算部署、基于人工智能平台PAI部署和GPU云服务器部署。通过这些方案,用户可以摆脱“服务器繁忙”的困扰,实现快速部署与使用
2247 3
评测|全网最强🚀!5min部署满血版DeepSeek,零成本,无需编程!
|
12月前
|
JavaScript 前端开发 编译器
吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
【10月更文挑战第2天】吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
220 2
|
12月前
|
前端开发 JavaScript 小程序
前端新机遇!为什么我建议学习鸿蒙?
【10月更文挑战第4天】前端新机遇!为什么我建议学习鸿蒙?
468 0
前端新机遇!为什么我建议学习鸿蒙?
|
12月前
|
JavaScript 前端开发 安全
TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
【10月更文挑战第12天】TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
854 0
TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
|
11月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
12月前
|
前端开发 JavaScript 编译器
不走弯路,纯前端如何把图片导出成视频!
【10月更文挑战第3天】不走弯路,纯前端如何把图片导出成视频!
587 3
|
11月前
|
前端开发
配置 Webpack 实现热更新
【10月更文挑战第23天】还可以进一步深入探讨热更新的具体实现细节、不同场景下的应用案例,以及如何针对特定需求进行优化等方面的内容。通过全面、系统地了解 Webpack 热更新的配置方法,能够更好地利用这一功能,提升项目的开发效率和性能表现。同时,要不断关注 Webpack 及相关技术的发展动态,以便及时掌握最新的热更新技术和最佳实践。