@@ -20,7 +20,7 @@ import { VNode } from "./vnode";
2020 */
2121export function diff ( oldVNode : any , newVNode : any , host ?: Node ) {
2222 if ( ! oldVNode ) {
23- markNewVNode ( newVNode ) ;
23+ newVNode = markNewVNode ( newVNode ) ;
2424 }
2525 newVNode = diffRecursive ( oldVNode , newVNode ) ;
2626 const updated = updateDOM ( oldVNode , newVNode ) ;
@@ -67,6 +67,8 @@ function markNewVNode(node: VNode) {
6767 markNewVNode ( child ) ;
6868 }
6969 }
70+ node ?. isNew === false && ( node . isNew = true ) ;
71+ return node ;
7072}
7173
7274/**
@@ -83,8 +85,23 @@ function markNewVNode(node: VNode) {
8385 * @param oldVNode
8486 * @param newVNode
8587 */
86- function diffRecursive ( oldVNode : VNode , newVNode : VNode , host ?: VNode ) {
87- if ( ! oldVNode ) return newVNode ;
88+ function diffRecursive (
89+ oldVNode : VNode | undefined ,
90+ newVNode : VNode ,
91+ host ?: VNode
92+ ) {
93+ if ( ! oldVNode ) {
94+ newVNode = markNewVNode ( newVNode ) ;
95+ return newVNode ;
96+ }
97+ // the type of the vnode may be VNode[] ( x.map(() => (<></>)) )
98+ if ( oldVNode instanceof Array && newVNode instanceof Array ) {
99+ const maxLength = Math . max ( oldVNode . length , newVNode . length ) ;
100+ for ( let i = 0 ; i < maxLength ; i ++ ) {
101+ newVNode [ i ] = diffRecursive ( oldVNode [ i ] , newVNode [ i ] , host ) ;
102+ }
103+ return newVNode ;
104+ }
88105 // just text node
89106 if ( typeof oldVNode === "string" && typeof newVNode === "string" ) {
90107 if ( oldVNode !== newVNode ) {
@@ -93,7 +110,7 @@ function diffRecursive(oldVNode: VNode, newVNode: VNode, host?: VNode) {
93110 }
94111 }
95112
96- if ( oldVNode ? .isDeleted ) {
113+ if ( oldVNode . isDeleted ) {
97114 return oldVNode ;
98115 }
99116
@@ -117,7 +134,6 @@ function diffRecursive(oldVNode: VNode, newVNode: VNode, host?: VNode) {
117134 */
118135 newVNode . isUpdated = true ;
119136 }
120-
121137 // diff the child nodes of the old vnode and the new vnode
122138 if ( oldVNode . children && newVNode . children ) {
123139 const oldChildren = Object . values ( oldVNode . children ) ;
@@ -133,6 +149,5 @@ function diffRecursive(oldVNode: VNode, newVNode: VNode, host?: VNode) {
133149 }
134150 }
135151 }
136-
137152 return newVNode ;
138153}
0 commit comments