VUE的一个数据绑定与页面刷新相关的bug
1.场景:
N层嵌套的循环查询业务场景,框架是vue。其中在最后一层查完之后,还需要查其中每一项的两个属性,类型都是列表。查完之后将其赋值给一个变量用于页面展示。代码如下:
(1)异常代码:
getStepRequirement(contentService) {
this.contentLoading = true
fetchStepRequirement({
id: contentService.contentId
}).then(res => {
this.contentLoading = false
if (res.data.code === 200) {
if (res.data.result) {
res.data.result.forEach(requ => {
// 拼出要求
requ['requirementDetail'] = requ.stepRequirementName.replace('%%', requ.stepRequirementData)
})
}
contentService['requirementList'] = res.data.result || []
} else {
this.$message({ type: 'error', message: res.data.msg })
}
})
}
this.contentLoading = true
fetchStepContent(param).then(res => {
this.contentLoading = false
if (res.data.code === 200) {
step['contentList'] = res.data.result || []
step.contentList.forEach(content => {
content.contentServiceLinks.forEach(contentService => {
contentService['requirementList'] = []
this.getStepRequirement(contentService)
switch (contentService.serviceTypeCode.toLowerCase()) {
case 'homework':
contentService['homeworkList'] = []
this.getAssignhomeworkById(contentService)
break
case 'comment':
break
case 'course':
break
}
})
})
} else {
this.$message({ type: 'error', message: res.data.msg })
}
})
this.showingContent = step
(2)正常代码:
const param = {
flag: false,
id: step.id
}
// 是否选课标志
if (step.stepTypeCode === 'PSTD1') param.flag = true
this.contentLoading = true
fetchStepContent(param).then(res => {
this.contentLoading = false
if (res.data.code === 200) {
step['contentList'] = res.data.result || []
step.contentList.forEach(content => {
content.contentServiceLinks.forEach(contentService => {
contentService['requirementList'] = []
this.getStepRequirement(contentService)
})
})
} else {
this.$message({ type: 'error', message: res.data.msg })
}
})
this.showingContent = step
getStepRequirement(contentService) {
this.contentLoading = true
fetchStepRequirement({
id: contentService.contentId
}).then(res => {
this.contentLoading = false
if (res.data.code === 200) {
if (res.data.result) {
res.data.result.forEach(requ => {
// 拼出要求
requ['requirementDetail'] = requ.stepRequirementName.replace('%%', requ.stepRequirementData)
})
}
contentService['requirementList'] = res.data.result || []
switch (contentService.serviceTypeCode.toLowerCase()) {
case 'homework':
contentService['homeworkList'] = []
this.getAssignhomeworkById(contentService)
break
case 'comment':
break
case 'course':
break
}
} else {
this.$message({ type: 'error', message: res.data.msg })
}
})
}
2.原因分析
首先赋值那里,会将showingContent 和step绑定,后边step发生变化之后,会同步变化到showingContent (浅复制问题,不再解释)。但是异常代码中homeworkList和requirementList是并列关系相互独立的,这很符合我们平常的思维模式。但是实际运行结果是,时而只显示了homework,时而只显示了requirement,又时而能都显示出来。具体深层原因暂不完全确定,有知道根本原因的大佬欢迎指教。个人猜想是页面刷新机制方面的问题。因为数据已经都正确了,但是页面未完全刷新。
3.解决方法
解决也有两个:一个就是上边(2)的代码,将其写成依赖关系,实测有效。一个就是在html的相应位置加v-if,然后在查询返回homework和requirement之后分别进行重置if条件来强制刷新。
强制刷新关键代码:
this.xxx = false
this.$nextTick(() => { this.xxx = true })
VUE的一个数据绑定与页面刷新相关的bug的更多相关文章
- vue 项目中如何在页面刷新的状态下保留数据
1.问题:在vue项目中,刷新页面之后,我当前打开的所有菜单,都消失,我如何实现刷新之后页面仍然是刷新之前的状态 效果图: 解决方法: 使用vuex作状态管理: 将vuex里面的数据同步更新到loca ...
- vue 键盘回车事件导致页面刷新的问题,路由多了一个问号
问题: <el-form @submit.native.prevent> <el-form-item > <el-input @keyup.enter.native=&q ...
- 记一个界面刷新相关的Bug
今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...
- vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息
一.页面刷新时,如何保持原有vuex中的state信息 页面刷新后,原有的 vuex 中的 state 会发生改变,如果在页面刷新之前,可以将 state 信息保存,页面重新加载时,再将该值赋给 st ...
- vue 使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- Vue基础01vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令
自学vue框架,每天记录重要的知识点,与大家分享!有不足之处,希望大家指正. 本篇将讲述:vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令 前期学习基础,使用vue. ...
- 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- vue 浏览器页面刷新时执行一段代码
当刷新(浏览器刷新)页面的时候,重置到首页(或其他页面)纯js的是window.onload()但是vue几乎不会用到这个,vue所有的是生命周期那么我们可以根据生命周期来实现这个beforeCrea ...
- vue传参页面刷新数据丢失问题
在做vue的时候,经常会遇到组件之间数据的传递问题,通过params或者query传参,但是,当页面刷新的时候,数据会丢失,找不到数据.今天经过总结,解决了这个问题.通过了一下几种情况进行传值: 通过 ...
随机推荐
- c/c++ open函数的阻塞和非阻塞
调用open函数时,可以指定是以阻塞方式还是以非阻塞方式打开一个文件描述符. 阻塞方式打开: int fd = open("/dev/tty", O_RDWR|O_NONBLOCK ...
- Java核心技术第八章——泛型程序设计(1)
1.泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用.例如:不希望为了聚集String和Integer对象分别设计不同的类.(个人觉得此处说的聚集译为:创建一个对象,属性可以为 ...
- 我眼中的 Nginx(一):Nginx 和位运算
作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...
- SQLI LABS Stacked Part(38-53) WriteUp
这里是堆叠注入部分 less-38: 这题啥过滤都没有,直接上: ?id=100' union select 1,2,'3 less-39: 同less-38: ?id=100 union selec ...
- 机器学习——交叉验证,GridSearchCV,岭回归
0.交叉验证 交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set) ...
- 从PRISM开始学WPF(五)MVVM(一)ViewModel-更新至Prism7.1
0x5 MVVM [7.1updated]截止到目前,我们看到7.1的更新主要在三个地方 PrismApplication ,并且不再使用Bootstrapper 更新了unity,现在使用prism ...
- 痞子衡嵌入式:如果i.MX RT是一匹悍马,征服它时别忘了用马镫MCUBootUtility
-- 跨界之风吹满地,先锋当属NXP; 微控制器谁独骚?当仁不让看RT! 恩智浦半导体2017年10月正式发布了业内首款跨界处理器-i.MX RT系列,这是MCU界的汗血宝马,更是一匹桀骜不驯的悍马. ...
- js对象数组(JSON) 根据某个共同字段 分组
首先判断 var arr = [ {"id":"1001","name":"值1","value": ...
- 部署ionic开发环境
(1)安装Node.js 首先您需要安装 Node.js,后续会使用到其中的 NPM 工具. (2)安装JDK 需要安装JDK,官网下载安装.命令窗口中输入 java -Xmx2048m -versi ...
- mac 卸载通过官网下载包安装的node
sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}