Skip to content

Commit 82fa91e

Browse files
committed
fix: improve internal render effect sequencing
1 parent 2781559 commit 82fa91e

File tree

5 files changed

+57
-1
lines changed

5 files changed

+57
-1
lines changed

.changeset/smooth-rings-rush.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 internal render effect sequencing

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,16 +519,19 @@ export function schedule_effect(signal, sync) {
519519
const target_block = signal.block;
520520
const is_pre_effect = (flags & PRE_EFFECT) !== 0;
521521
let target_signal;
522+
let target_signal_level;
522523
let is_target_pre_effect;
523524
let i = length;
524525
while (true) {
525526
target_signal = current_queued_pre_and_render_effects[--i];
526-
if (target_signal.l <= target_level) {
527+
target_signal_level = target_signal.l;
528+
if (target_signal_level <= target_level) {
527529
if (i + 1 === length) {
528530
should_append = true;
529531
} else {
530532
is_target_pre_effect = (target_signal.f & PRE_EFFECT) !== 0;
531533
if (
534+
target_signal_level < target_level ||
532535
target_signal.block !== target_block ||
533536
(is_target_pre_effect && !is_pre_effect)
534537
) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
let { post } = $props();
3+
</script>
4+
5+
<svelte:head>
6+
<title>{post.title}</title>
7+
</svelte:head>
8+
9+
<p>{post.title}</p>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, target, window }) {
6+
const [btn1] = target.querySelectorAll('button');
7+
8+
assert.htmlEqual(window.document.head.innerHTML, ``);
9+
10+
flushSync(() => {
11+
btn1.click();
12+
});
13+
14+
assert.htmlEqual(window.document.head.innerHTML, `<title>hello world</title>`);
15+
16+
flushSync(() => {
17+
btn1.click();
18+
});
19+
20+
assert.htmlEqual(window.document.head.innerHTML, `<title>hello world</title>`);
21+
}
22+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script>
2+
import Seo from './Seo.svelte';
3+
4+
let post = $state(null);
5+
6+
function toggle() {
7+
post = post ? null : { title: 'hello world' };
8+
}
9+
</script>
10+
11+
<button onclick={toggle}>
12+
toggle
13+
</button>
14+
15+
{#if post}
16+
<Seo {post} />
17+
{/if}

0 commit comments

Comments
 (0)