当前位置: 首页 > news >正文

Vue 缓存之坑,变量赋值方式和响应式数据

const { IsSuperAdmin } = useUserStore().userInfo;/*** 获取后台动态路由数据,解析并注册到全局路由** @returns Promise<RouteRecordRaw[]> 解析后的动态路由列表*/function generateRoutes() {return new Promise<RouteRecordRaw[]>((resolve, reject) => {console.log("userInfo", useUserStore().userInfo);console.log("IsSuperAdmin", IsSuperAdmin);.....}

image

这个问题涉及到 JavaScript 的变量赋值方式响应式数据的特性。让我详细解释一下:

问题原因

const { IsSuperAdmin } = useUserStore().userInfo;

这行代码使用了解构赋值,它创建了一个新的变量 IsSuperAdmin,这个变量是原始值的拷贝,而不是引用。

具体解释

1、解构赋值创建的是拷贝

  • const { IsSuperAdmin } = useUserStore().userInfo; 相当于:

  • const IsSuperAdmin = useUserStore().userInfo.IsSuperAdmin;

  • 这是一个值拷贝,不是引用

2、响应式数据需要特殊处理

  • 如果 useUserStore().userInfo 是响应式对象(如 Vue 的 reactive 或 Pinia 的 store)

  • 直接解构会失去响应性,得到的是当前时刻的静态值

3、console.log 显示的是不同来源

  • useUserStore().userInfo.IsSuperAdmin → 直接从 store 读取,获取最新值

  • IsSuperAdmin → 解构时拷贝的旧值,不会自动更新

解决方案

方案1:直接访问 store(推荐)

function generateRoutes() {return new Promise<RouteRecordRaw[]>((resolve, reject) => {const userStore = useUserStore();console.log("userInfo", userStore.userInfo.IsSuperAdmin); // 最新值console.log("IsSuperAdmin", userStore.userInfo.IsSuperAdmin); // 最新值// ...});
}

方案2:使用计算属性(如果需要响应式)

import { computed } from 'vue';const IsSuperAdmin = computed(() => useUserStore().userInfo.IsSuperAdmin);function generateRoutes() {return new Promise<RouteRecordRaw[]>((resolve, reject) => {console.log("userInfo", useUserStore().userInfo.IsSuperAdmin);console.log("IsSuperAdmin", IsSuperAdmin.value); // 使用 .value// ...});
}

方案3:使用 toRefs 保持响应性

import { toRefs } from 'vue';const { IsSuperAdmin } = toRefs(useUserStore().userInfo);function generateRoutes() {return new Promise<RouteRecordRaw[]>((resolve, reject) => {console.log("userInfo", useUserStore().userInfo.IsSuperAdmin);console.log("IsSuperAdmin", IsSuperAdmin.value); // 使用 .value// ...});
}

最佳实践

避免在函数外部解构响应式数据,而是在需要的时候直接从 store 中读取:

function generateRoutes() {return new Promise<RouteRecordRaw[]>((resolve, reject) => {const userStore = useUserStore();// 始终使用 userStore.userInfo.IsSuperAdmin 来获取最新值console.log("IsSuperAdmin status:", userStore.userInfo.IsSuperAdmin);// ...});
}

这样可以确保你总是获取到最新的数据,而不是过时的拷贝值。

文章转载自:VipSoft

原文链接:https://www.cnblogs.com/vipsoft/p/19058216

体验地址:http://www.jnpfsoft.com/?from=001YH

http://www.dtcms.com/a/507331.html

相关文章:

  • AWS CloudFormation —— 自动化部署的“云中脚本大师”
  • 响应式网站下载长沙排名推广
  • 【软考备考】 安全协议:SSL/TLS, IPSec 详解
  • 在 HarmonyOS 中平滑切换“点状粒子”与“图片粒子”(含可运行 ArkTS 示例)
  • 海门市规划建设局网站会考网页制作视频教程全集
  • 4-ARM-PEG-Pyrene(2)/Biotin(2),多功能化聚乙二醇修饰荧光标记生物分子的设计与应用探索
  • 做三折页宣传册 网站昆明网上房地产官网
  • redis-7.4.6部署安装
  • CSS学习笔记(五):CSS媒体查询入门指南
  • Redis多线程架构深度解析-从单线程到I/O Threading
  • 掌握 iOS 26 App 性能监控,多工具组合流程与实战指南
  • Spring定时任务中数据未持久化的深度排查指南:从autoCommit到事务管理的终极解法
  • BAT 大厂 java高频面试题汇总:JVM+Spring+ 分布式 +tomcat+MyBatis
  • 宸建设计网站想注册一个做网站的公司好
  • ThingsBoard开源物联网平台实践:从环境搭建到数据可视化
  • 第二章 线性表——课后习题解练【数据结构(c语言版 第2版)】
  • 成都网站建设开发公选择好的软件开发培训班
  • 待学习--中间件
  • Avalonia vs UniApp 全面对比分析
  • 策略模式优化多重判断
  • ios云打包证书申请不需要苹果电脑也是可以的
  • UniApp USB存储设备U盘操作、读写原生插件
  • 邢台 建网站中国机械设备制造网
  • app网站开发河 又最新新闻热点事件300字
  • ZooKeeper集群:分布式系统的核心守护者
  • 网鼎杯 2020 朱雀组
  • 开发避坑指南(63):解决SQL排序子句列名歧义异常:Column ‘xxx‘ is ambiguous
  • 【C + +】红黑树:全面剖析与深度学习
  • 数据结构(顺序表和链表)
  • C# 基础——装箱和拆箱