Vue 的 DOM 复用机制差点害死我😅

54 阅读1分钟

前言

好几次测试给我提了同一个问题。

打开弹窗时,手机号输入框会自动输入“1”。

一开始我以为是偶先问题。

我检查了好几次,输入框没有默认值啊???这咋回事???

寻找问题

我就照常打开会员管理的弹窗,里面数据都是清清爽爽的,没有出现自动填入数据的情况啊😅。

接着排查了所有可能初始化的内容,都没有找到会默认设置“1”的情况。

直到我发现,选择个体工商户后,会需要选择是否是法人选项。

这里单选项的默认取值是“1”。

image.png

难道说?是这里的默认值“1”赋值给了手机号输入框?

我尝试隐藏了单选项,结果没有再出现手机号存在默认值“1”的问题。

解决问题

单选项是通过v-if条件渲染的。

​Vue 的 DOM 复用机制​

Vue 在渲染时会尽可能复用已有的 DOM 元素以提升性能。例如:

  • 当两个输入框的结构相似(如 typeplaceholder 不同但其他属性相同)时,Vue 会复用同一个 DOM 节点,仅更新差异属性(如 id),而不会清空已输入的 value 值。
  • ​后果​​:如果通过 v-if 切换输入框类型,未销毁的 DOM 节点可能导致旧值残留到下一个输入框中。

所以在销毁 DOM 后,一定要记得清空数据。

注意:

若在 DOM 节点销毁前,就清空数据,可能会触发 DOM 元素复用机制,将旧值传给上个数据。