Prechádzať zdrojové kódy

child component sets parent vnode.elm

Evan You 10 rokov pred
rodič
commit
a7737c821c

+ 4 - 0
src/runtime/instance/lifecycle.js

@@ -65,6 +65,10 @@ export function lifecycleMixin (Vue) {
       this.$el = this.__patch__(this._vnode, vnode)
     }
     this._vnode = vnode
+    // set parent vnode element
+    if (this.$options._parentVnode) {
+      this.$options._parentVnode.elm = this.$el
+    }
     if (this._mounted) {
       callHook(this, 'updated')
     }

+ 3 - 0
src/runtime/vdom/component.js

@@ -64,9 +64,12 @@ function init (vnode) {
   const data = vnode.data
   const child = new data.Ctor({
     parent: data.parent,
+    _parentVnode: vnode,
     _renderData: data.data,
     _renderChildren: data.children
   })
+  // the child sets the parent vnode's elm when mounted
+  // and when updated.
   child.$mount()
   data.child = child
 }

+ 7 - 11
src/runtime/vdom/patch.js

@@ -22,10 +22,6 @@ function sameVnode (vnode1, vnode2) {
   return vnode1.key === vnode2.key && vnode1.tag === vnode2.tag
 }
 
-function getElm (vnode) {
-  return vnode.elm || vnode.data.child._vnode.elm
-}
-
 function createKeyToOldIdx (children, beginIdx, endIdx) {
   let i, key
   const map = {}
@@ -130,7 +126,7 @@ export default function createPatchFunction (backend) {
           }
           invokeDestroyHook(ch)
           listeners = cbs.remove.length + 1
-          rm = createRmCb(getElm(ch), listeners)
+          rm = createRmCb(ch.elm, listeners)
           for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm)
           if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) {
             i(ch, rm)
@@ -170,19 +166,19 @@ export default function createPatchFunction (backend) {
         newEndVnode = newCh[--newEndIdx]
       } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
         patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue)
-        nodeOps.insertBefore(parentElm, getElm(oldStartVnode), nodeOps.nextSibling(getElm(oldEndVnode)))
+        nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm))
         oldStartVnode = oldCh[++oldStartIdx]
         newEndVnode = newCh[--newEndIdx]
       } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
         patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue)
-        nodeOps.insertBefore(parentElm, getElm(oldEndVnode), getElm(oldStartVnode))
+        nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm)
         oldEndVnode = oldCh[--oldEndIdx]
         newStartVnode = newCh[++newStartIdx]
       } else {
         if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)
         idxInOld = oldKeyToIdx[newStartVnode.key]
         if (isUndef(idxInOld)) { // New element
-          nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), getElm(oldStartVnode))
+          nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm)
           newStartVnode = newCh[++newStartIdx]
         } else {
           elmToMove = oldCh[idxInOld]
@@ -194,13 +190,13 @@ export default function createPatchFunction (backend) {
           }
           patchVnode(elmToMove, newStartVnode, insertedVnodeQueue)
           oldCh[idxInOld] = undefined
-          nodeOps.insertBefore(parentElm, getElm(elmToMove), getElm(oldStartVnode))
+          nodeOps.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm)
           newStartVnode = newCh[++newStartIdx]
         }
       }
     }
     if (oldStartIdx > oldEndIdx) {
-      before = isUndef(newCh[newEndIdx + 1]) ? null : getElm(newCh[newEndIdx + 1])
+      before = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm
       addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue)
     } else if (newStartIdx > newEndIdx) {
       removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx)
@@ -273,7 +269,7 @@ export default function createPatchFunction (backend) {
         createElm(vnode, insertedVnodeQueue)
 
         if (parent !== null) {
-          nodeOps.insertBefore(parent, getElm(vnode), nodeOps.nextSibling(elm))
+          nodeOps.insertBefore(parent, vnode.elm, nodeOps.nextSibling(elm))
           removeVnodes(parent, [oldVnode], 0, 0)
         }
       }