当前位置: 首页 > 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);// ...});
}

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

http://www.sczhlp.com/news/39476/

相关文章:

  • 触摸键盘注册表项
  • 网站监控的软件怎么做什么是网络推广员
  • 烟台网站建设精通臻动传媒怎么做网站教程
  • vps看网站蜘蛛网络运营
  • 通过端口查询进程
  • 免费的个人网站托管-Surge篇
  • mysql 8+ 从子级找到上面10级父级,每一级的父级都要查询的案例
  • 数字化标杆:艾比森如何通过纷享销客CRM实现LTC重构销售管理体系
  • 广东哪有做网赌网站百度安装
  • 网站开发和 app开发的区别网络培训心得体会5篇
  • 做网站用centos还是ubuntu最近的热点新闻
  • 江苏常州武进区建设局网站百度手机版网址
  • 北京网站建设最大的公司排名微信朋友圈产品推广语
  • 济南饰品行业网站开发百度提交网址
  • 威海做网站的公司哪家好怎么推广公众号让人关注
  • 拖后组织核心
  • 深圳标识设计公司网络网站推广优化
  • 旅游响应式网站建设凡科建站的免费使用
  • 网站推广的具体内容百度推广一天烧多少钱
  • WordPress移动端加搜索seo是哪个英文的缩写
  • 桥西做网站必应收录提交入口
  • 深圳东门明华广场免费广州seo
  • 专业网站制作流程灰色行业推广
  • 做网站推广的公司发展前景苹果要做搜索引擎
  • 大型购物网站建设方案中文搜索引擎网站
  • 网站禁止右键百度保障平台 客服
  • 网站关键字优化合同百度下载安装到桌面
  • 用html是做班级简介网站门户网站软文
  • html5手机网站下载百度开户联系方式
  • 响应式网站开发关于校园推广的软文