Skip to content

Commit dee5bed

Browse files
authored
fix: improve each block index handling (#9644)
* fix: improve each block index handling * format
1 parent 02f3f42 commit dee5bed

File tree

5 files changed

+29
-10
lines changed

5 files changed

+29
-10
lines changed

.changeset/thirty-wombats-relax.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: improve each block index handling

packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,7 +2491,7 @@ export const template_visitors = {
24912491
next();
24922492
},
24932493
BindDirective(node, context) {
2494-
const { state, path } = context;
2494+
const { state, path, visit } = context;
24952495

24962496
/** @type {import('estree').Expression[]} */
24972497
const properties = [];
@@ -2621,10 +2621,18 @@ export const template_visitors = {
26212621
break;
26222622
}
26232623

2624-
case 'this':
2625-
call_expr = b.call(`$.bind_this`, state.node, setter, node.expression);
2624+
case 'this': {
2625+
const expression = node.expression;
2626+
call_expr = b.call(
2627+
`$.bind_this`,
2628+
state.node,
2629+
setter,
2630+
expression.type === 'Identifier'
2631+
? expression
2632+
: /** @type {import('estree').Expression} */ (visit(expression))
2633+
);
26262634
break;
2627-
2635+
}
26282636
case 'textContent':
26292637
case 'innerHTML':
26302638
case 'innerText':

packages/svelte/src/compiler/phases/scope.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -495,12 +495,10 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) {
495495
}
496496

497497
if (node.index) {
498-
scope.declare(
499-
b.id(node.index),
500-
// TODO see logic in EachBlock in dom.ts
501-
node.key ? 'derived' : 'normal',
502-
'const'
503-
);
498+
const is_keyed =
499+
node.key &&
500+
(node.key.type !== 'Identifier' || !node.index || node.key.name !== node.index);
501+
scope.declare(b.id(node.index), is_keyed ? 'derived' : 'normal', 'const');
504502
}
505503
if (node.key) visit(node.key, { scope });
506504

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: '<div>0</div><div>1</div>'
5+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{#each ["a", "b"] as result, i (i)}
2+
<div>{i}</div>
3+
{/each}

0 commit comments

Comments
 (0)