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. CentOS_关机与重启命令详解

    Linux centos关机与重启命令详解 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过 ...

  2. bat脚本自定义魔兽warIII运行分辨率,去黑边

    我们一般平时安装完WarIII后运行时的分辨率默认是800*600,导致有黑边的存在.所以我写了一个bat脚本来自定义WarIII的运行分辨率.需要以管理员身份运行. 下载链接: 链接:https:/ ...

  3. 关于wordpress升级遇到的问题

    前几天登录我的博客后台,发现可以升级了,顺手点了一下,但顺接出现了几个报错,然后这里记录一下解决方法: 1.出现“另一更新正在进行”的错误解决: 这是因为可能你上次更新失败了,或者WordPress在 ...

  4. 中国四大骨干网与十大ISP服务商

    1.骨干网 几台计算机连接起来,互相可以看到其他人的文件,这叫局域网,整个城市的计算机都连接起来,就是城域网,把城市之间连接起来的网就叫骨干网.这些骨干网是国家批准的可以直接和国外连接的互联网.其他有 ...

  5. Excel日期中那个著名的bug

    一个软件中的bug能够持续多久?答案不一,大多数bug在软件测试阶段就已经被干掉,又有许多死在Preview阶段,抑或正式上线后不久被干掉,有些则伴随软件终生,直到下一代产品发布才寿终正寝,而Exce ...

  6. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  7. .NET Core微服务之基于Ocelot实现API网关服务(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...

  8. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  9. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...

  10. dubbo不完全指南

    Dubbo架构 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的 ...