Skip to content

Commit 4b274dd

Browse files
authored
feat: derive destructured derived objects values (#10488)
* feat: derive destructured derived objects values * address feedback * address feedback
1 parent 302c379 commit 4b274dd

File tree

5 files changed

+69
-1
lines changed

5 files changed

+69
-1
lines changed

.changeset/fluffy-humans-worry.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+
feat: derive destructured derived objects values

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,16 @@ export const javascript_visitors_runes = {
315315
)
316316
);
317317
for (let i = 0; i < bindings.length; i++) {
318-
bindings[i].expression = b.member(b.call('$.get', b.id(id)), b.literal(i), true);
318+
const binding = bindings[i];
319+
declarations.push(
320+
b.declarator(
321+
binding.node,
322+
b.call(
323+
'$.derived',
324+
b.thunk(b.member(b.call('$.get', b.id(id)), b.literal(i), true))
325+
)
326+
)
327+
);
319328
}
320329
}
321330
continue;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { test } from '../../test';
2+
import { flushSync } from 'svelte';
3+
import { log } from './log.js';
4+
5+
export default test({
6+
before_test() {
7+
log.length = 0;
8+
},
9+
10+
async test({ assert, target }) {
11+
const [b1, b2, b3] = target.querySelectorAll('button');
12+
log.length = 0;
13+
flushSync(() => {
14+
b1.click();
15+
});
16+
assert.deepEqual(log, ['a', 1]);
17+
log.length = 0;
18+
flushSync(() => {
19+
b2.click();
20+
});
21+
assert.deepEqual(log, ['b', 1]);
22+
log.length = 0;
23+
flushSync(() => {
24+
b3.click();
25+
});
26+
assert.deepEqual(log, ['c', 1]);
27+
}
28+
});
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/** @type {any[]} */
2+
export const log = [];
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<script>
2+
import { log } from './log.js';
3+
4+
let a = $state(0);
5+
let b = $state(0);
6+
let c = $state(0);
7+
const {a: a1, b: b1, c: c1} = $derived({a, b, c});
8+
9+
$effect(() => {
10+
log.push('a', a1)
11+
});
12+
13+
$effect(() => {
14+
log.push('b', b1)
15+
});
16+
17+
$effect(() => {
18+
log.push('c', c1)
19+
});
20+
</script>
21+
22+
<button onclick={() => a++}>{a1}</button>
23+
<button onclick={() => b++}>{b1}</button>
24+
<button onclick={() => c++}>{c1}</button>

0 commit comments

Comments
 (0)