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的更多相关文章

  1. vue 项目中如何在页面刷新的状态下保留数据

    1.问题:在vue项目中,刷新页面之后,我当前打开的所有菜单,都消失,我如何实现刷新之后页面仍然是刷新之前的状态 效果图: 解决方法: 使用vuex作状态管理: 将vuex里面的数据同步更新到loca ...

  2. vue 键盘回车事件导致页面刷新的问题,路由多了一个问号

    问题: <el-form @submit.native.prevent> <el-form-item > <el-input @keyup.enter.native=&q ...

  3. 记一个界面刷新相关的Bug

    今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...

  4. vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息

    一.页面刷新时,如何保持原有vuex中的state信息 页面刷新后,原有的 vuex 中的 state 会发生改变,如果在页面刷新之前,可以将 state 信息保存,页面重新加载时,再将该值赋给 st ...

  5. vue 使用localStorage解决vuex在页面刷新后数据被清除的问题

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...

  6. Vue基础01vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令

    自学vue框架,每天记录重要的知识点,与大家分享!有不足之处,希望大家指正. 本篇将讲述:vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令 前期学习基础,使用vue. ...

  7. 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...

  8. vue 浏览器页面刷新时执行一段代码

    当刷新(浏览器刷新)页面的时候,重置到首页(或其他页面)纯js的是window.onload()但是vue几乎不会用到这个,vue所有的是生命周期那么我们可以根据生命周期来实现这个beforeCrea ...

  9. vue传参页面刷新数据丢失问题

    在做vue的时候,经常会遇到组件之间数据的传递问题,通过params或者query传参,但是,当页面刷新的时候,数据会丢失,找不到数据.今天经过总结,解决了这个问题.通过了一下几种情况进行传值: 通过 ...

随机推荐

  1. win7下建立超级隐藏账户

    win7下建立超级隐藏账户 实验目的: 隐藏用户,不让管理员简单的发现 隐藏方法: 1.命令提示符中创建隐藏账户这种方法只能将账户在"命令提示符"中进行隐藏,而对于"计算 ...

  2. windows之如何把iso文件转换为VHD文件

    (1)Convert-WindowsImage.ps1的下载路径: 链接:https://pan.baidu.com/s/18duFQFW8T_yI2JeQ1lhJgQ 提取码:b5ps autoun ...

  3. echarts在tab切换时容器宽度设置为100%,只展示100px

    在 mychart.setOption(option); 后面加上 mychart.resize(); 即可

  4. 【Python实践-1】求一元二次方程的两个解

    知识点: import sys, sys模块包含了与Python解释器和它的环境有关的函数. “sys”是“system”的缩写.sys.exit() 中途退出程序, (注:0是正常退出,其他为不正常 ...

  5. 吴恩达机器学习笔记60-大规模机器学习(Large Scale Machine Learning)

    一.随机梯度下降算法 之前了解的梯度下降是指批量梯度下降:如果我们一定需要一个大规模的训练集,我们可以尝试使用随机梯度下降法(SGD)来代替批量梯度下降法. 在随机梯度下降法中,我们定义代价函数为一个 ...

  6. 一行命令更新所有 npm 依赖包

    npm 包的更新速度很快,为了将项目或者全局依赖更新到最新版本.传统的做法是一个一个更新,比如更新 react 到最新版本,命令如下: # npm npm i --save react@latest ...

  7. 深度解密HTTP通信细节

    目录 HTTP报文截获 背景介绍 抓包 mac本地 远程docker 请求 && 分析 关闭服务进程 关闭docker 重启docker 正常请求 HTTP协议分析 整体介绍 编码 M ...

  8. 微信小程序开发02-小程序基本介绍

    前言 前面我们研究了下微信小程序的执行流程,因为拿不到源码,只能算我们的猜想,我们需要更加了解小程序还需要做具体的项目,于是我们将原来那套还算复杂的业务拿出来: [组件化开发]前端进阶篇之如何编写可维 ...

  9. SmartSql 介绍

    介绍 SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics .... ...

  10. Java基础系列-Stream

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748817.html 一.概述 Stream操作简称流操作,这里的流与IO流毫无关系, ...