File tree Expand file tree Collapse file tree 6 files changed +58
-6
lines changed
tests/runtime-runes/samples/effect-order-4 Expand file tree Collapse file tree 6 files changed +58
-6
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' svelte ' : patch
3
+ ---
4
+
5
+ fix: ensure correct parent effect is associated with render effects
Original file line number Diff line number Diff line change @@ -201,7 +201,10 @@ export function user_effect(fn) {
201
201
202
202
if ( defer ) {
203
203
var context = /** @type {ComponentContext } */ ( component_context ) ;
204
- ( context . e ??= [ ] ) . push ( fn ) ;
204
+ ( context . e ??= [ ] ) . push ( {
205
+ fn,
206
+ parent : active_effect
207
+ } ) ;
205
208
} else {
206
209
var signal = effect ( fn ) ;
207
210
return signal ;
Original file line number Diff line number Diff line change @@ -1050,11 +1050,18 @@ export function pop(component) {
1050
1050
if ( component !== undefined ) {
1051
1051
context_stack_item . x = component ;
1052
1052
}
1053
- const effects = context_stack_item . e ;
1054
- if ( effects !== null ) {
1053
+ const component_effects = context_stack_item . e ;
1054
+ if ( component_effects !== null ) {
1055
+ var previous_effect = active_effect ;
1055
1056
context_stack_item . e = null ;
1056
- for ( var i = 0 ; i < effects . length ; i ++ ) {
1057
- effect ( effects [ i ] ) ;
1057
+ try {
1058
+ for ( var i = 0 ; i < component_effects . length ; i ++ ) {
1059
+ var component_effect = component_effects [ i ] ;
1060
+ set_active_effect ( component_effect . parent ) ;
1061
+ effect ( component_effect . fn ) ;
1062
+ }
1063
+ } finally {
1064
+ set_active_effect ( previous_effect ) ;
1058
1065
}
1059
1066
}
1060
1067
component_context = context_stack_item . p ;
Original file line number Diff line number Diff line change @@ -15,7 +15,7 @@ export type ComponentContext = {
15
15
/** context */
16
16
c : null | Map < unknown , unknown > ;
17
17
/** deferred effects */
18
- e : null | Array < ( ) => void | ( ( ) => void ) > ;
18
+ e : null | Array < { fn : ( ) => void | ( ( ) => void ) ; parent : null | Effect } > ;
19
19
/** mounted */
20
20
m : boolean ;
21
21
/**
Original file line number Diff line number Diff line change
1
+ import { test } from '../../test' ;
2
+ import { flushSync } from 'svelte' ;
3
+
4
+ export default test ( {
5
+ async test ( { assert, target, logs } ) {
6
+ const [ b1 ] = target . querySelectorAll ( 'button' ) ;
7
+ flushSync ( ( ) => {
8
+ b1 . click ( ) ;
9
+ } ) ;
10
+ flushSync ( ( ) => {
11
+ b1 . click ( ) ;
12
+ } ) ;
13
+ assert . deepEqual ( logs , [
14
+ { count : 0 , doubled : 0 } ,
15
+ { count : 1 , doubled : 2 } ,
16
+ { count : 2 , doubled : 4 }
17
+ ] ) ;
18
+ }
19
+ } ) ;
Original file line number Diff line number Diff line change
1
+ <script >
2
+ let count = $state (0 );
3
+
4
+ function increment () {
5
+ count += 1 ;
6
+ }
7
+
8
+ $effect .pre (() => {
9
+ const doubled = count * 2 ;
10
+ $effect (() => {
11
+ console .log ({ count, doubled });
12
+ });
13
+ });
14
+ </script >
15
+
16
+ <button onclick ={increment }>
17
+ clicks: {count }
18
+ </button >
You can’t perform that action at this time.
0 commit comments