From 64d8acdf0156fda1d4ffa820d31691e6eb138002 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 5 Jul 2024 16:30:04 -0400 Subject: [PATCH] fix --- .../src/internal/client/dom/blocks/each.js | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 79a7d77c6f..748a800a23 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -1,12 +1,11 @@ +/** @import { TemplateNode } from '#client' */ import { EACH_INDEX_REACTIVE, EACH_IS_ANIMATED, EACH_IS_CONTROLLED, EACH_IS_STRICT_EQUALS, EACH_ITEM_REACTIVE, - EACH_KEYED, - HYDRATION_START_ELSE, - HYDRATION_START + EACH_KEYED } from '../../../../constants.js'; import { hydrate_next, @@ -162,7 +161,30 @@ export function each(anchor, flags, get_collection, get_key, render_fn, fallback if (is_else !== (length === 0) || hydrate_node === undefined) { // hydration mismatch — remove the server-rendered DOM and start over - // remove(hydrate_nodes); + var depth = 0; + var node = hydrate_node; + + while ( + node.nodeType !== 8 || + (depth === 0 && /** @type {Comment} */ (node).data !== '/each') + ) { + if (node.nodeType === 8) { + var data = /** @type {Comment} */ (node).data; + if (data === '#each' || data === '#each!') { + depth += 1; + } else if (data === '/each') { + depth -= 1; + } + } + + var next = /** @type {TemplateNode} */ (node.nextSibling); + node.remove(); + node = next; + } + + anchor = node; + + set_hydrate_node(node); set_hydrating(false); mismatch = true; }