-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinitialize.ts
63 lines (52 loc) · 1.36 KB
/
initialize.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { track, deleteTrack } from './effect'
import { proxyState, deepProxyState } from './proxy'
import {
IState,
IActions,
IStoreOptionsArg,
IInstance,
AnyArray,
AnyObject,
IStoreArgs,
IProxyInstanceRes
} from './types'
let instanceId = 0
function handleState<
S extends IState,
A extends IActions<IProxyInstanceRes<S, A>>
>(instance: IInstance<S, A>, rawTarget: AnyArray | AnyObject) {
const { isDeepWatch } = instance.options
const proxyStateRes = isDeepWatch
? deepProxyState(instance, rawTarget, true)
: proxyState(instance, rawTarget)
instance.state = proxyStateRes
}
function handleStoreApi<
S extends IState,
A extends IActions<IProxyInstanceRes<S, A>>
>(instance: IInstance<S, A>) {
const storeApi = {
watch: track<S, A>(instance),
watchEffect: track<S, A>(instance, true),
deleteWatch: deleteTrack<S, A>(instance)
}
instance.storeApi = storeApi
}
export function createInstance<
S extends IState,
A extends IActions<IProxyInstanceRes<S, A>>
>(storeArgs: IStoreArgs<S, A>, options: IStoreOptionsArg = {}) {
const { state = {}, actions = {} } = storeArgs
// 创建实例对象
const instance: IInstance<S, A> = {
id: instanceId++,
trackStore: {},
storeApi: {},
state: {},
actions,
options
}
handleStoreApi(instance)
handleState<S, A>(instance, state)
return instance
}