@@ -477,13 +477,8 @@ export function createSlice<
477
477
478
478
const selectSelf = ( state : State ) => state
479
479
480
- const selectorCache = new WeakMap <
481
- ( rootState : any ) => State ,
482
- Record < string , ( rootState : any ) => any >
483
- > ( )
484
-
485
480
const injectedSelectorCache = new WeakMap <
486
- CombinedSliceReducer < any > ,
481
+ Slice < State , CaseReducers , Name , ReducerPath , Selectors > ,
487
482
WeakMap <
488
483
( rootState : any ) => State | undefined ,
489
484
Record < string , ( rootState : any ) => any >
@@ -492,7 +487,7 @@ export function createSlice<
492
487
493
488
let _reducer : ReducerWithInitialState < State >
494
489
495
- return {
490
+ const slice : Slice < State , CaseReducers , Name , ReducerPath , Selectors > = {
496
491
name,
497
492
reducerPath,
498
493
reducer ( state , action ) {
@@ -507,64 +502,44 @@ export function createSlice<
507
502
508
503
return _reducer . getInitialState ( )
509
504
} ,
510
- getSelectors ( selectState ?: ( rootState : any ) => State ) {
511
- if ( selectState ) {
512
- const cached = selectorCache . get ( selectState )
513
- if ( cached ) {
514
- return cached
515
- }
516
- const selectors : Record < string , ( rootState : any ) => any > = { }
505
+ getSelectors ( selectState : ( rootState : any ) => State = selectSelf ) {
506
+ let selectorCache = injectedSelectorCache . get ( this )
507
+ if ( ! selectorCache ) {
508
+ selectorCache = new WeakMap ( )
509
+ injectedSelectorCache . set ( this , selectorCache )
510
+ }
511
+ let cached = selectorCache . get ( selectState )
512
+ if ( ! cached ) {
513
+ cached = { }
517
514
for ( const [ name , selector ] of Object . entries (
518
515
options . selectors ?? { }
519
516
) ) {
520
- selectors [ name ] = ( rootState : any , ...args : any [ ] ) =>
521
- selector ( selectState ( rootState ) , ...args )
517
+ cached [ name ] = ( rootState : any , ...args : any [ ] ) =>
518
+ selector (
519
+ selectState ( rootState ) ??
520
+ ( this !== slice ? this . getInitialState ( ) : ( undefined as any ) ) ,
521
+ ...args
522
+ )
522
523
}
523
- selectorCache . set ( selectState , selectors )
524
- return selectors as any
525
- } else {
526
- return options . selectors ?? { }
524
+ selectorCache . set ( selectState , cached )
527
525
}
526
+ return cached as any
528
527
} ,
529
528
get selectors ( ) {
530
529
return this . getSelectors ( defaultSelectSlice )
531
530
} ,
532
- injectInto ( reducer , { reducerPath, ...config } = { } ) {
533
- reducer . inject (
531
+ injectInto ( injectable , { reducerPath, ...config } = { } ) {
532
+ injectable . inject (
534
533
{ reducerPath : reducerPath ?? this . reducerPath , reducer : this . reducer } ,
535
534
config
536
535
)
537
- let selectorCache = injectedSelectorCache . get ( reducer )
538
- if ( ! selectorCache ) {
539
- selectorCache = new WeakMap ( )
540
- injectedSelectorCache . set ( reducer , selectorCache )
541
- }
542
536
return {
543
537
...this ,
544
- getSelectors (
545
- selectState : ( rootState : any ) => State | undefined = selectSelf
546
- ) {
547
- const cached = selectorCache ! . get ( selectState )
548
- if ( cached ) {
549
- return cached
550
- }
551
- const selectors : Record < string , ( rootState : any ) => any > = { }
552
- for ( const [ name , selector ] of Object . entries (
553
- options . selectors ?? { }
554
- ) ) {
555
- selectors [ name ] = ( rootState : any , ...args : any [ ] ) =>
556
- selector (
557
- selectState ( rootState ) ?? this . getInitialState ( ) ,
558
- ...args
559
- )
560
- }
561
- selectorCache ! . set ( selectState , selectors )
562
- return selectors as any
563
- } ,
564
538
get selectors ( ) {
565
539
return this . getSelectors ( defaultSelectSlice )
566
540
} ,
567
541
} as any
568
542
} ,
569
543
}
544
+ return slice
570
545
}
0 commit comments