@@ -30,6 +30,8 @@ export function resetStore (store, hot) {
30
30
export function resetStoreState ( store , state , hot ) {
31
31
const oldState = store . _state
32
32
const oldScope = store . _scope
33
+ const oldCache = store . _computedCache
34
+ const oldGettersKeySet = new Set ( store . getters ? Object . keys ( store . getters ) : [ ] )
33
35
34
36
// bind store public getters
35
37
store . getters = { }
@@ -45,6 +47,10 @@ export function resetStoreState (store, state, hot) {
45
47
46
48
scope . run ( ( ) => {
47
49
forEachValue ( wrappedGetters , ( fn , key ) => {
50
+ // Filter stale getters' key by comparing oldGetters and wrappedGetters,
51
+ // the key does not be removed from oldGettersKeySet are the key of stale computed cache.
52
+ // Stale computed cache: the computed cache should be removed as the corresponding module is removed.
53
+ oldGettersKeySet . delete ( key )
48
54
// use computed to leverage its lazy-caching mechanism
49
55
// direct inline function use will lead to closure preserving oldState.
50
56
// using partial to return function with only arguments preserved in closure environment.
@@ -64,6 +70,7 @@ export function resetStoreState (store, state, hot) {
64
70
// register the newly created effect scope to the store so that we can
65
71
// dispose the effects when this method runs again in the future.
66
72
store . _scope = scope
73
+ store . _computedCache = computedCache
67
74
68
75
// enable strict mode for new state
69
76
if ( store . strict ) {
@@ -82,6 +89,24 @@ export function resetStoreState (store, state, hot) {
82
89
83
90
// dispose previously registered effect scope if there is one.
84
91
if ( oldScope ) {
92
+ const deadEffects = [ ]
93
+ const staleComputedCache = new Set ( )
94
+ oldGettersKeySet . forEach ( ( staleKey ) => {
95
+ staleComputedCache . add ( oldCache [ staleKey ] )
96
+ } )
97
+ oldScope . effects . forEach ( effect => {
98
+ // Use the staleComputedCache match the computed property of reactiveEffect,
99
+ // to specify the stale cache
100
+ if ( effect . deps . length && ! staleComputedCache . has ( effect . computed ) ) {
101
+ // Merge the effect that already have dependencies and prevent from being killed.
102
+ scope . effects . push ( effect )
103
+ } else {
104
+ // Collect the dead effects.
105
+ deadEffects . push ( effect )
106
+ }
107
+ } )
108
+ // Dispose the dead effects.
109
+ oldScope . effects = deadEffects
85
110
oldScope . stop ( )
86
111
}
87
112
}
0 commit comments