Skip to content

Commit 7f237c2

Browse files
dummdidummtrueadm
andauthored
fix: omit this bind this arg if we know it's not a signal (#9635)
fixes #9629 Co-authored-by: Dominic Gannaway <[email protected]>
1 parent dee5bed commit 7f237c2

File tree

4 files changed

+32
-7
lines changed

4 files changed

+32
-7
lines changed

.changeset/lovely-rules-eat.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: omit this bind this arg if we know it's not a signal

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,10 @@ function serialize_inline_component(node, component_name, context) {
899899
if (bind_this !== null) {
900900
const prev = fn;
901901
const assignment = b.assignment('=', bind_this, b.id('$$value'));
902-
const bind_this_id = bind_this;
902+
const bind_this_id = /** @type {import('estree').Expression} */ (
903+
// if expression is not an identifier, we know it can't be a signal
904+
bind_this.type === 'Identifier' ? bind_this : undefined
905+
);
903906
fn = (node_id) =>
904907
b.call(
905908
'$.bind_this',
@@ -2621,18 +2624,17 @@ export const template_visitors = {
26212624
break;
26222625
}
26232626

2624-
case 'this': {
2625-
const expression = node.expression;
2627+
case 'this':
26262628
call_expr = b.call(
26272629
`$.bind_this`,
26282630
state.node,
26292631
setter,
2630-
expression.type === 'Identifier'
2631-
? expression
2632-
: /** @type {import('estree').Expression} */ (visit(expression))
2632+
/** @type {import('estree').Expression} */ (
2633+
// if expression is not an identifier, we know it can't be a signal
2634+
node.expression.type === 'Identifier' ? node.expression : undefined
2635+
)
26332636
);
26342637
break;
2635-
}
26362638
case 'textContent':
26372639
case 'innerHTML':
26382640
case 'innerText':
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
async test({ assert, target, component }) {
5+
assert.equal(target.querySelector('img'), component.items[0].img);
6+
}
7+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
let { items = [{ src: 'https://ds' }] } = $props();
3+
</script>
4+
5+
{#each items as item, i}
6+
<img
7+
src={item.src}
8+
bind:this={items[i].img}
9+
alt="slider{i}"
10+
/>
11+
{/each}

0 commit comments

Comments
 (0)