File tree Expand file tree Collapse file tree 4 files changed +46
-14
lines changed Expand file tree Collapse file tree 4 files changed +46
-14
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' svelte ' : patch
3
+ ---
4
+
5
+ fix: lazily connect derievds (in deriveds) to their parent
Original file line number Diff line number Diff line change @@ -68,10 +68,6 @@ export function derived(fn) {
68
68
signal . created = get_stack ( 'CreatedAt' ) ;
69
69
}
70
70
71
- if ( parent_derived !== null ) {
72
- ( parent_derived . children ??= [ ] ) . push ( signal ) ;
73
- }
74
-
75
71
return signal ;
76
72
}
77
73
Original file line number Diff line number Diff line change @@ -957,26 +957,30 @@ export function get(signal) {
957
957
new_deps . push ( signal ) ;
958
958
}
959
959
}
960
- } else if ( is_derived && /** @type {Derived } */ ( signal ) . deps === null ) {
960
+ }
961
+
962
+ if (
963
+ is_derived &&
964
+ /** @type {Derived } */ ( signal ) . deps === null &&
965
+ ( active_reaction === null || untracking || ( active_reaction . f & DERIVED ) !== 0 )
966
+ ) {
961
967
var derived = /** @type {Derived } */ ( signal ) ;
962
968
var parent = derived . parent ;
963
- var target = derived ;
964
969
965
- while ( parent !== null ) {
966
- // Attach the derived to the nearest parent effect, if there are deriveds
967
- // in between then we also need to attach them too
970
+ if ( parent !== null ) {
971
+ // Attach the derived to the nearest parent effect or derived
968
972
if ( ( parent . f & DERIVED ) !== 0 ) {
969
973
var parent_derived = /** @type {Derived } */ ( parent ) ;
970
974
971
- target = parent_derived ;
972
- parent = parent_derived . parent ;
975
+ if ( ! parent_derived . children ?. includes ( derived ) ) {
976
+ ( parent_derived . children ??= [ ] ) . push ( derived ) ;
977
+ }
973
978
} else {
974
979
var parent_effect = /** @type {Effect } */ ( parent ) ;
975
980
976
- if ( ! parent_effect . deriveds ?. includes ( target ) ) {
977
- ( parent_effect . deriveds ??= [ ] ) . push ( target ) ;
981
+ if ( ! parent_effect . deriveds ?. includes ( derived ) ) {
982
+ ( parent_effect . deriveds ??= [ ] ) . push ( derived ) ;
978
983
}
979
- break ;
980
984
}
981
985
}
982
986
}
Original file line number Diff line number Diff line change @@ -803,6 +803,33 @@ describe('signals', () => {
803
803
} ;
804
804
} ) ;
805
805
806
+ test ( 'nested deriveds do not connect inside parent deriveds if unused' , ( ) => {
807
+ return ( ) => {
808
+ let a = render_effect ( ( ) => { } ) ;
809
+ let b : Derived < void > | undefined ;
810
+
811
+ const destroy = effect_root ( ( ) => {
812
+ a = render_effect ( ( ) => {
813
+ $ . untrack ( ( ) => {
814
+ b = derived ( ( ) => {
815
+ derived ( ( ) => { } ) ;
816
+ derived ( ( ) => { } ) ;
817
+ derived ( ( ) => { } ) ;
818
+ } ) ;
819
+ $ . get ( b ) ;
820
+ } ) ;
821
+ } ) ;
822
+ } ) ;
823
+
824
+ assert . deepEqual ( a . deriveds ?. length , 1 ) ;
825
+ assert . deepEqual ( b ?. children , null ) ;
826
+
827
+ destroy ( ) ;
828
+
829
+ assert . deepEqual ( a . deriveds , null ) ;
830
+ } ;
831
+ } ) ;
832
+
806
833
test ( 'deriveds containing effects work correctly when used with untrack' , ( ) => {
807
834
return ( ) => {
808
835
let a = render_effect ( ( ) => { } ) ;
You can’t perform that action at this time.
0 commit comments