写 Vue 写久了,谁都遇到过这种玄学问题。
控制台打印数据,值已经改得干干净净,变量、数组、对象字段全都变了,逻辑也走通了。但页面视图一动不动,该变的文字不变、该刷新的列表不刷新、该隐藏的区块不隐藏。
第一反应都是疑惑:数据变了为啥视图不更?难道 Vue 又抽风了?
其实根本不是框架 bug,全是平时写代码不注意的响应式漏洞。
最常见的就是对象新增字段不触发更新。
很多人习惯直接给定义好的对象动态加属性。data 里声明的是空对象,后续业务逻辑里直接 obj.xxx = 新值。
数据层面确实加上了,但不在初始响应式依赖里,视图完全监听不到。
我之前做表单编辑踩过好几次,动态回填扩展字段,控制台看数据齐全,页面输入框就是不显示。一开始以为是赋值时机不对,来回改执行顺序,最后才反应过来是新增属性没有响应式。
比对象更坑的是数组变更写法。
Vue 能监听的数组方法有限,push、splice、pop 这些没问题。但很多人图方便,直接通过下标修改数组项、或者直接替换数组长度。
这种写法,数据改了,依赖不更新,页面直接躺平不动。
最迷惑人的是,简单页面、少量数据偶尔能更新。不是稳定复现,时好时坏,让人完全摸不着头脑。
还有一种超级隐蔽的情况:变量覆盖丢失响应式。
原本是响应式对象,直接被整体赋值成了普通对象。比如 this.list = 普通新数组,this.info = 普通新对象。
看似赋值没问题,有时候配合异步、重置逻辑,会把原来的响应式实例彻底覆盖。后续再改字段,页面彻底无反应。
很多人排查半天,最后重置页面、刷新组件就好了,根本不知道是响应式丢了。
还有个高频坑,异步赋值顺序问题。
接口请求回来直接批量赋值对象深层字段,同时页面刚挂载、DOM 未初始化完成。数据先到位、视图后挂载,导致部分依赖渲染错过更新时机。
数据永远是最新的,页面停留在旧状态,手动改一下数据又能刷新。
网上很多人无脑用 $forceUpdate 强制刷新,看似解决问题,实则治标不治本。
强制刷新只是强行渲染页面,掩盖了你代码写法不规范、响应式丢失、赋值逻辑混乱的问题。项目越写越乱,后续各种诡异渲染问题层出不穷。
写多了慢慢总结出来,Vue 视图不更新,从来不是框架的问题。
要么是写法绕过了响应式监听,要么是赋值时机不对,要么是动态属性脱离了依赖收集。
现在我写代码,动态字段优先用官方规范写法,数组绝不下标修改,对象新增字段绝不直接赋值。宁愿多写两行规范代码,也不赌框架玄学更新。
前端大部分玄学 bug,说到底都是自己写法不规范埋的坑。