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);
.....
}

这个问题涉及到 JavaScript 的变量赋值方式和响应式数据的特性。让我详细解释一下:
问题原因
const { IsSuperAdmin } = useUserStore().userInfo;
这行代码使用了解构赋值,它创建了一个新的变量 IsSuperAdmin,这个变量是原始值的拷贝,而不是引用。
具体解释
解构赋值创建的是拷贝:
const { IsSuperAdmin } = useUserStore().userInfo;相当于:const IsSuperAdmin = useUserStore().userInfo.IsSuperAdmin;- 这是一个值拷贝,不是引用
响应式数据需要特殊处理:
- 如果
useUserStore().userInfo是响应式对象(如 Vue 的 reactive 或 Pinia 的 store) - 直接解构会失去响应性,得到的是当前时刻的静态值
- 如果
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);
// ...
});
}
这样可以确保你总是获取到最新的数据,而不是过时的拷贝值。
Vue 缓存之坑,变量赋值方式和响应式数据的更多相关文章
- vue源码之响应式数据
分析vue是如何实现数据响应的. 前记 现在回顾一下看数据响应的原因. 之前看了vuex和vue-i18n的源码, 他们都有自己内部的vm, 也就是vue实例. 使用的都是vue的响应式数据特性及$w ...
- Vue实现双向绑定的原理以及响应式数据
一.vue中的响应式属性 Vue中的数据实现响应式绑定 1.对象实现响应式: 是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集 ...
- Vue provide/inject 部分源码分析 实现响应式数据更新
provide/inject 数据响应式更新的坑及源码解析 下面是我自己曾经遇到 一个问题,直接以自己QA的形式来写吧 自问自答了,需要的同学也可以直接访问segmentfault地址 官网给出实例, ...
- vue响应式数据变化
vue响应式数据变化 话不多说,先上代码: //拷贝一份数组原型,防止修改所有数组类型变量的原型方法 let arrayProto = Array.prototype;// 数组原型上的方法 let ...
- 仿VUE创建响应式数据
VUE对于前端开发人员都非常熟悉了,其工作原理估计也都能说的清个大概,具体代码的实现估计看的人不会太多,这里对vue响应式数据做个简单的实现. 先简单介绍一下VUE数据响应原理,VUE响应数据分为对象 ...
- angular,vue,react的基本语法—插值表达式,渲染数据,响应式数据
基本语法: 1.插值表达式: vue:{{}} react:{} angular:{{}} 2.渲染数据 vue js: export default{ data(){ return{ msg:&qu ...
- vue基础响应式数据
1.vue 采用 v……vm……m,模式,v---->el,vm---->new Vue(实例),m---->data 数据,让前端从操作大量的dom元素中解放出来. 2.vue响应 ...
- Vue入门教程 第二篇 (数据绑定与响应式)
数据绑定 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ message }} </ ...
- Vue.js 源码分析(四) 基础篇 响应式原理 data属性
官网对data属性的介绍如下: 意思就是:data保存着Vue实例里用到的数据,Vue会修改data里的每个属性的访问控制器属性,当访问每个属性时会访问对应的get方法,修改属性时会执行对应的set方 ...
- 【Vue原理模拟】模拟Vue实现响应式数据
1. 预期效果 当数据变动时,触发自定义的回调函数. 2. 思路 对对象 object 的 setter 进行设置,使 setter 在赋值之后执行回调函数 callback(). 3.细节 3.1 ...
随机推荐
- 关于打高版本java,cc6复现
关于打高版本java,cc6复现 从上一篇的cc1中我们发现他不能作用在jdk_8u71以上的版本,因此;为了解决这个问题,引入了cc6 之所以不能用cc1打高版本,是由于在Java 8u71以后, ...
- Django的Model类
1.model 用来和数据交互的(读取和传入数据) 2.orm Object Relational Mapping对象关系映射,python中的model对象和数据库中的表做映射 3.重要概念 3.1 ...
- P5749 [IOI2019] 排列鞋子
算是一种新思路吧. 题目要求我们求最少的对调次数,想到了什么?求逆序对个数,我们只需将原来的 \(S_i\) 数组转化一下,求其逆序对个数即可. 转化规则为:从头开始,对于每个还未被赋值的 \(S_i ...
- 全选和全不选demo
1 <script> 2 3 $(function(){ 4 $("#chkAll").change(function(){ 5 6 //获取我们全选按钮的选中状态: ...
- Java中基本数据类型和引用数据类型的存放位置
基本数据类型存放在哪? 基本类型的变量存在栈里或者堆里不是由"大小可知,生存期可知"就能确定了.关键是上下文. 比如: void method(){ int a = 3; } 这自 ...
- 【10】LCT学习笔记
前言 老早就想写了,但是一直抽不出时间.借助集训的契机把这篇学习笔记写出来. 时间跨度比较长,可能有一些代码不是现在的码风,我会标注出来的. LCT 挺简单的,内容应该不多吧qwq. 长文警告:本文一 ...
- 前端开发系列083-Node篇之http
本文对Node的内置模块http进行介绍,包括该模块的基本情况和简单使用. 一.模块简介 http是Node的内置核心模块,包含了对HTTP处理的封装. 在Nodejs文件中可以直接在代码里通过var ...
- MS 笔试 FT面试
手写轮播 我也是醉了 闭包机制 外面的 可以访问 闭包里面的变量 会长时间存在在栈上 js变量类型 我就写了var 真是... function forsum () { var i,sum = ...
- POLIR-Economics-西方经济学学习经验(转发)
原文:https://bbs.pinggu.org/thread-894259-1-1.html https://bbs.pinggu.org/forum-47-1.html 西方经济学属于纯理论性的 ...
- MySQL存储引擎:MyISAM和InnoDB的区别 -九五小庞
InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎.它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚.InnoDB的性能与自动崩溃恢复的特性,使得它在非 ...