前端踩坑日记-watch监听到数据的变化但页面没有刷新

580 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言

111.jpg

兄弟们,好久不见呀~ 最近参与的项目中踩了不少的坑,得赶快总结记录下来,不然以后就都忘了哈哈哈

问题描述

页面用watch监听数据变化,刷新后接口有返回且在控制台打印正常,但是页面上不显示

image.png

image.png

具体就是这样,这里面分别调了三个接口,它们的处理方式一模一样,离谱的地方就在这: this.XXX2()对应的数据在页面刷新后时显时不显,另外两个都能正常显示!!!
更离谱的是: 本地服务调试无论怎么刷新都正常显示,服务发布到测试环境刷新就会出现上述问题!!!

解决过程

排查接口是否正常返回以及数据接收是否正确

常用的方法:

  • 控制台打印输出
  • 跟踪断点 一通操作下来,这个接口和另外两个都是正常的呀!

了解watch监听的机制

这里用到的watch的属性为:

  • immediate 设置为true时,可以保证进入页面就执行handler函数;
  • handler 这个函数中处理数据;

watch中的方法执行的阶段:
watch正常使用时只有参数改变才会执行方法,页面加载时并不会。当immediate为true,handler中的方法可在页面加载时执行,即此时watch会在created之前执行

定位到数据渲染出了问题

数据来源、接收及绑定都没问题,就是页面是不显示,所以大概率是渲染的过程出现了问题。正常情况下生命周期是这样的:

image.png

数据渲染的阶段在updated周期里,所以考虑强制更新;在获取到数据之后调用:this.$forceUpdate()

image.png

总结

修改之后在本地调试没有问题,然后发布到测试环境也没有问题了。但是还是疑惑之前为什么会出现这种问题?有网友说是因为数据层次太多,render函数没有自动更新。可我这个页面只有简单的一层呀?各位如有研究,还请不吝赐教呀!