好比,vue
mounted () {
document.body.appendChild(this.$el);
// insertAdjacentElement
// insertBefore
},
这几行代码会致使 dom 元素位置 与 VNode 指望的位置不一致node
好比:app
---------------------------------------dom
父组件: this
div(id='p')
h1 第1个
button(@click="add") 新增
p(v-for="(item,index) in list", :key="index")
| 第 {{item}} 个元素
ccc
---js部分
methods: {
add () {
this.list.push(1);
}
}源码
---------------------------------------it
子组件 ccc:io
div
| 我是document.body.append的元素
---js部分
mounted () {
document.body.appendChild(this.$el);
// insertAdjacentElement
// insertBefore
}
---------------------------------------function
原本 ccc 在VNode 中的位置其父 parent 是 id 为 p 的div 元素, 而后因为在 mounted 中,$el的位置发生了移动,致使其实际的位置发生了改变,父节点变为 body 元素。cli
这将致使 父组件中的 v-for p 元素,渲染失败
缘由:
在点击 父组件 按钮是,会触发 组件的update, 这将会致使新的元素会 insert 到dom树中,这段代码在 vue 源码,patch.js 中
function insert (parent, elm, ref$$1) {
if (isDef(parent)) {
if (isDef(ref$$1)) {
if (ref$$1.parentNode === parent) {
nodeOps.insertBefore(parent, elm, ref$$1);
}
} else {
nodeOps.appendChild(parent, elm);
}
}
}
在插入新的 p 元素时, 会执行这段代码, 三个参数 分别为: div(id='p'), p 元素自身, ref$$1 为 ccc 的$el
因为 ccc 的$el 的parent 发生了变化,致使这行判断失效, 渲染失败。