fix(hmr): deep clone reused hoisted trees during dev
fix vitejs/vite#2022
This commit is contained in:
		
							parent
							
								
									c69f4ea857
								
							
						
					
					
						commit
						5a7a1b8293
					
				| @ -459,7 +459,7 @@ export function cloneVNode<T, U>( | |||||||
| ): VNode<T, U> { | ): VNode<T, U> { | ||||||
|   // This is intentionally NOT using spread or extend to avoid the runtime
 |   // This is intentionally NOT using spread or extend to avoid the runtime
 | ||||||
|   // key enumeration cost.
 |   // key enumeration cost.
 | ||||||
|   const { props, ref, patchFlag } = vnode |   const { props, ref, patchFlag, children } = vnode | ||||||
|   const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props |   const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props | ||||||
|   return { |   return { | ||||||
|     __v_isVNode: true, |     __v_isVNode: true, | ||||||
| @ -479,7 +479,10 @@ export function cloneVNode<T, U>( | |||||||
|           : normalizeRef(extraProps) |           : normalizeRef(extraProps) | ||||||
|         : ref, |         : ref, | ||||||
|     scopeId: vnode.scopeId, |     scopeId: vnode.scopeId, | ||||||
|     children: vnode.children, |     children: | ||||||
|  |       __DEV__ && patchFlag === PatchFlags.HOISTED && isArray(children) | ||||||
|  |         ? (children as VNode[]).map(deepCloneVNode) | ||||||
|  |         : children, | ||||||
|     target: vnode.target, |     target: vnode.target, | ||||||
|     targetAnchor: vnode.targetAnchor, |     targetAnchor: vnode.targetAnchor, | ||||||
|     staticCount: vnode.staticCount, |     staticCount: vnode.staticCount, | ||||||
| @ -513,6 +516,18 @@ export function cloneVNode<T, U>( | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * Dev only, for HMR of hoisted vnodes reused in v-for | ||||||
|  |  * https://github.com/vitejs/vite/issues/2022
 | ||||||
|  |  */ | ||||||
|  | function deepCloneVNode(vnode: VNode): VNode { | ||||||
|  |   const cloned = cloneVNode(vnode) | ||||||
|  |   if (isArray(vnode.children)) { | ||||||
|  |     cloned.children = (vnode.children as VNode[]).map(deepCloneVNode) | ||||||
|  |   } | ||||||
|  |   return cloned | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * @private |  * @private | ||||||
|  */ |  */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user