15
15
* of making flow understand it is not worth it.
16
16
*/
17
17
18
- import VNode from './vnode'
18
+ import VNode , { cloneVNode } from './vnode'
19
19
import config from '../config'
20
20
import { SSR_ATTR } from 'shared/constants'
21
21
import { registerRef } from './modules/ref'
@@ -123,7 +123,7 @@ export function createPatchFunction (backend) {
123
123
function createElm ( vnode , insertedVnodeQueue , parentElm , refElm , nested ) {
124
124
// mip patch: 如果是渲染好的 Node 节点,直接插入
125
125
if ( vnode instanceof Node ) {
126
- nodeOps . insertBefore ( parentElm , vnode , refElm )
126
+ nodeOps . insertBefore ( parentElm , vnode . cloneNode ( true ) , refElm )
127
127
return
128
128
}
129
129
@@ -438,20 +438,20 @@ export function createPatchFunction (backend) {
438
438
newCh [ newEndIdx -- ] = oldEndVnode
439
439
oldEndVnode = oldCh [ oldEndIdx -- ]
440
440
} else if ( sameVnode ( oldStartVnode , newStartVnode ) ) {
441
- patchVnode ( oldStartVnode , newStartVnode , insertedVnodeQueue )
441
+ patchVnode ( oldStartVnode , newStartVnode , insertedVnodeQueue , newCh , newStartIdx )
442
442
oldStartVnode = oldCh [ ++ oldStartIdx ]
443
443
newStartVnode = newCh [ ++ newStartIdx ]
444
444
} else if ( sameVnode ( oldEndVnode , newEndVnode ) ) {
445
- patchVnode ( oldEndVnode , newEndVnode , insertedVnodeQueue )
445
+ patchVnode ( oldEndVnode , newEndVnode , insertedVnodeQueue , newCh , newStartIdx )
446
446
oldEndVnode = oldCh [ -- oldEndIdx ]
447
447
newEndVnode = newCh [ -- newEndIdx ]
448
448
} else if ( sameVnode ( oldStartVnode , newEndVnode ) ) { // Vnode moved right
449
- patchVnode ( oldStartVnode , newEndVnode , insertedVnodeQueue )
449
+ patchVnode ( oldStartVnode , newEndVnode , insertedVnodeQueue , newCh , newStartIdx )
450
450
canMove && nodeOps . insertBefore ( parentElm , oldStartVnode . elm , nodeOps . nextSibling ( oldEndVnode . elm ) )
451
451
oldStartVnode = oldCh [ ++ oldStartIdx ]
452
452
newEndVnode = newCh [ -- newEndIdx ]
453
453
} else if ( sameVnode ( oldEndVnode , newStartVnode ) ) { // Vnode moved left
454
- patchVnode ( oldEndVnode , newStartVnode , insertedVnodeQueue )
454
+ patchVnode ( oldEndVnode , newStartVnode , insertedVnodeQueue , newCh , newStartIdx )
455
455
canMove && nodeOps . insertBefore ( parentElm , oldEndVnode . elm , oldStartVnode . elm )
456
456
oldEndVnode = oldCh [ -- oldEndIdx ]
457
457
newStartVnode = newCh [ ++ newStartIdx ]
@@ -477,7 +477,7 @@ export function createPatchFunction (backend) {
477
477
}
478
478
479
479
if ( sameVnode ( vnodeToMove , newStartVnode ) ) {
480
- patchVnode ( vnodeToMove , newStartVnode , insertedVnodeQueue )
480
+ patchVnode ( vnodeToMove , newStartVnode , insertedVnodeQueue , newCh , newStartIdx )
481
481
oldCh [ idxInOld ] = undefined
482
482
canMove && nodeOps . insertBefore ( parentElm , vnodeToMove . elm , oldStartVnode . elm )
483
483
} else {
@@ -505,11 +505,23 @@ export function createPatchFunction (backend) {
505
505
}
506
506
}
507
507
508
- function patchVnode ( oldVnode , vnode , insertedVnodeQueue , removeOnly ) {
508
+ function patchVnode (
509
+ oldVnode ,
510
+ vnode ,
511
+ insertedVnodeQueue ,
512
+ ownerArray ,
513
+ index ,
514
+ removeOnly
515
+ ) {
509
516
if ( oldVnode === vnode ) {
510
517
return
511
518
}
512
519
520
+ if ( isDef ( vnode . elm ) && isDef ( ownerArray ) ) {
521
+ // clone reused vnode
522
+ vnode = ownerArray [ index ] = cloneVNode ( vnode )
523
+ }
524
+
513
525
const elm = vnode . elm = oldVnode . elm
514
526
515
527
if ( isTrue ( oldVnode . isAsyncPlaceholder ) ) {
@@ -733,7 +745,7 @@ export function createPatchFunction (backend) {
733
745
const isRealElement = isDef ( oldVnode . nodeType )
734
746
if ( ! isRealElement && sameVnode ( oldVnode , vnode ) ) {
735
747
// patch existing root node
736
- patchVnode ( oldVnode , vnode , insertedVnodeQueue , removeOnly )
748
+ patchVnode ( oldVnode , vnode , insertedVnodeQueue , null , null , removeOnly )
737
749
} else {
738
750
if ( isRealElement ) {
739
751
// mounting to a real element
0 commit comments