Skip to content

Commit 630ae55

Browse files
committed
add test
1 parent 886e616 commit 630ae55

File tree

5 files changed

+77
-2
lines changed

5 files changed

+77
-2
lines changed

packages/svelte/src/internal/client/runtime.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1472,8 +1472,13 @@ function create_derived_proxy(signal, derived_value) {
14721472
const value = Reflect.get(target, prop, receiver);
14731473
const derived_value = /** @type {import('./types.js').DerivedSignalValue<V>} */ (signal.v);
14741474
const proxied_objects = /** @type {any} */ (derived_value.o);
1475-
const { k: keys, p: path } = proxied_objects.get(target);
1475+
const proxied_object = proxied_objects.get(target);
1476+
if (proxied_object === undefined) {
1477+
return value;
1478+
}
1479+
const { k: keys, p: path } = proxied_object;
14761480

1481+
// Only apply the proxing when we really need it. Otherwise avoid it entirely.
14771482
if (
14781483
effect_active_and_not_render_effect() &&
14791484
keys.has(prop) &&

packages/svelte/tests/runtime-runes/samples/derived-fine-grain-property-3/main.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
2222
<button onclick={() => a++}>a</button>
2323
<button onclick={() => b++}>b</button>
24-
<button onclick={() => c = !c}>b</button>
24+
<button onclick={() => c = !c}>c</button>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { test } from '../../test';
2+
import { log } from './log';
3+
4+
export default test({
5+
before_test() {
6+
log.length = 0;
7+
},
8+
9+
async test({ assert, target }) {
10+
const [btn1, btn2, btn3, btn4, btn5] = target.querySelectorAll('button');
11+
12+
log.length = 0;
13+
14+
await btn1?.click();
15+
assert.deepEqual(log, ['f', [1, 0], 'first', 1]);
16+
17+
log.length = 0;
18+
19+
await btn5?.click();
20+
assert.deepEqual(log, ['f', [0, 0], 'first', 0]);
21+
22+
await btn1?.click();
23+
await btn1?.click();
24+
await btn1?.click();
25+
26+
log.length = 0;
27+
28+
await btn5?.click();
29+
assert.deepEqual(log, ['f', [4, 0], 'first', 4]);
30+
31+
log.length = 0;
32+
33+
await btn3?.click();
34+
await btn3?.click();
35+
await btn3?.click();
36+
37+
await btn5?.click();
38+
assert.deepEqual(log, ['f', [3, 0], 'first', 3]);
39+
}
40+
});
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: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
let d = $state(0);
8+
let e = $state(true);
9+
let f = $derived(e ? [ a, b ] : [ c, d ]);
10+
11+
$effect(() => {
12+
log.push('f', f);
13+
})
14+
15+
$effect(() => {
16+
log.push('first', f?.[0]);
17+
})
18+
19+
$effect(() => {
20+
log.push('second', f?.[1]);
21+
})
22+
</script>
23+
24+
<button onclick={() => a++}>a</button>
25+
<button onclick={() => b++}>b</button>
26+
<button onclick={() => c++}>c</button>
27+
<button onclick={() => d++}>d</button>
28+
<button onclick={() => e = !e}>e</button>

0 commit comments

Comments
 (0)