react-ui-basics 0.0.216 → 0.0.218
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle.css +720 -720
- package/package.json +1 -1
- package/src/store/Store.test.js +36 -6
- package/src/store/Store.ts +20 -20
- package/store/Store.d.ts +1 -1
- package/store/Store.js +19 -17
- package/store/Store.js.map +1 -1
package/package.json
CHANGED
package/src/store/Store.test.js
CHANGED
|
@@ -3,7 +3,7 @@ import {mount} from 'enzyme';
|
|
|
3
3
|
import Store, {useStore} from "./Store";
|
|
4
4
|
import {act} from 'react-dom/test-utils';
|
|
5
5
|
|
|
6
|
-
it('test
|
|
6
|
+
it('basic test, rerender on each change', () => {
|
|
7
7
|
const store = new Store({
|
|
8
8
|
count: 0,
|
|
9
9
|
value: ''
|
|
@@ -44,14 +44,14 @@ it('test 1', () => {
|
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
it('
|
|
47
|
+
it('no rerender if selector value doesn\'t change', () => {
|
|
48
48
|
const store = new Store({
|
|
49
49
|
count: 0,
|
|
50
50
|
value: ''
|
|
51
51
|
});
|
|
52
52
|
let renderCount = 0
|
|
53
53
|
const MyComponent = () => {
|
|
54
|
-
let count = useStore(store, it=> it.count);
|
|
54
|
+
let count = useStore(store, it => it.count);
|
|
55
55
|
renderCount++
|
|
56
56
|
return <div>{count}</div>;
|
|
57
57
|
};
|
|
@@ -73,8 +73,7 @@ it('test 2', () => {
|
|
|
73
73
|
})
|
|
74
74
|
});
|
|
75
75
|
expect(wrapper).toHaveHTML('<div>1</div>');
|
|
76
|
-
|
|
77
|
-
expect(renderCount).toBe(3);
|
|
76
|
+
expect(renderCount).toBe(2);
|
|
78
77
|
|
|
79
78
|
act(() => {
|
|
80
79
|
store.set({
|
|
@@ -82,5 +81,36 @@ it('test 2', () => {
|
|
|
82
81
|
})
|
|
83
82
|
});
|
|
84
83
|
expect(wrapper).toHaveHTML('<div>1</div>');
|
|
85
|
-
expect(renderCount).toBe(
|
|
84
|
+
expect(renderCount).toBe(2);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('update value if selector dependencies change', () => {
|
|
88
|
+
const store = new Store({
|
|
89
|
+
key: 'foo',
|
|
90
|
+
foo: 'foo',
|
|
91
|
+
bar: 'bar',
|
|
92
|
+
});
|
|
93
|
+
let renderCount = 0
|
|
94
|
+
let renderedValue = []
|
|
95
|
+
|
|
96
|
+
const MyComponent = () => {
|
|
97
|
+
let key = useStore(store, it => it.key);
|
|
98
|
+
let value = useStore(store, it => it[key], [key]);
|
|
99
|
+
renderCount++
|
|
100
|
+
renderedValue.push(value)
|
|
101
|
+
return <div>{value}</div>;
|
|
102
|
+
};
|
|
103
|
+
const wrapper = mount(<MyComponent/>);
|
|
104
|
+
expect(wrapper).toHaveHTML('<div>foo</div>');
|
|
105
|
+
expect(renderCount).toBe(1);
|
|
106
|
+
expect(renderedValue).toEqual(['foo']);
|
|
107
|
+
|
|
108
|
+
act(() => {
|
|
109
|
+
store.set(it => {
|
|
110
|
+
it.key = 'bar'
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
expect(wrapper).toHaveHTML('<div>bar</div>');
|
|
114
|
+
expect(renderCount).toBe(2);
|
|
115
|
+
expect(renderedValue).toEqual(['foo', 'bar']);
|
|
86
116
|
});
|
package/src/store/Store.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {useEffect,
|
|
1
|
+
import {useEffect, useReducer} from "react";
|
|
2
2
|
import {createProxy} from "./ProxyTools";
|
|
3
3
|
import {isFunction, isObject} from "../Tools";
|
|
4
4
|
|
|
5
|
-
const STORES = new Map<Symbol, any
|
|
5
|
+
const STORES = new Map<Symbol, Store<any>>()
|
|
6
6
|
|
|
7
7
|
type Setter<T> = (oldState: T) => T | void;
|
|
8
8
|
type ListenerFn = () => void;
|
|
@@ -28,38 +28,33 @@ export class Store<T> extends AbstractStore<T> {
|
|
|
28
28
|
super()
|
|
29
29
|
let that = this;
|
|
30
30
|
let listeners: Map<Symbol, ListenerFn> = new Map<Symbol, () => void>()
|
|
31
|
-
let
|
|
31
|
+
let value = initialState;
|
|
32
32
|
let runListeners = () => {
|
|
33
33
|
for (let listener of listeners.values()) {
|
|
34
34
|
listener()
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
-
|
|
38
|
-
let get = (): T => STORES.get(index);
|
|
39
|
-
let reset = () => {
|
|
40
|
-
STORES.set(index, initialState)
|
|
41
|
-
runListeners();
|
|
42
|
-
};
|
|
43
|
-
reset()
|
|
44
|
-
|
|
45
|
-
that.get = get
|
|
37
|
+
that.get = (): T => value;
|
|
46
38
|
that.set = (setter) => {
|
|
47
39
|
let result;
|
|
48
40
|
if (isFunction(setter)) {
|
|
49
|
-
const proxy = createProxy(
|
|
41
|
+
const proxy = createProxy(value as object);
|
|
50
42
|
result = (setter as Setter<T>)(proxy);
|
|
51
43
|
if (!result || result === proxy)
|
|
52
44
|
result = proxy.bake()
|
|
53
45
|
} else if (isObject(setter)) {
|
|
54
|
-
result = {...
|
|
46
|
+
result = {...value, ...setter}
|
|
55
47
|
} else {
|
|
56
48
|
result = setter
|
|
57
49
|
}
|
|
58
50
|
|
|
59
|
-
|
|
51
|
+
value = result
|
|
52
|
+
runListeners();
|
|
53
|
+
}
|
|
54
|
+
that.reset = () => {
|
|
55
|
+
value = initialState
|
|
60
56
|
runListeners();
|
|
61
57
|
}
|
|
62
|
-
that.reset = reset
|
|
63
58
|
|
|
64
59
|
that.subscribe = (fn: ListenerFn) => {
|
|
65
60
|
const key = Symbol();
|
|
@@ -70,6 +65,7 @@ export class Store<T> extends AbstractStore<T> {
|
|
|
70
65
|
}
|
|
71
66
|
|
|
72
67
|
that.toString = (): string => name;
|
|
68
|
+
STORES.set(Symbol(), that)
|
|
73
69
|
}
|
|
74
70
|
}
|
|
75
71
|
|
|
@@ -90,15 +86,19 @@ export function useStore<T, R>(store: Store<T>, selector?: Selector<T, R>, selec
|
|
|
90
86
|
if (!selector)
|
|
91
87
|
selector = (defaultSelector as Selector<T, R>)
|
|
92
88
|
|
|
93
|
-
const [
|
|
89
|
+
const [_, forceUpdate] = useReducer(x => x + 1, 0);
|
|
90
|
+
let value = selector(store.get())
|
|
94
91
|
|
|
95
92
|
useEffect(() => {
|
|
96
93
|
const updateState = () => {
|
|
97
|
-
|
|
94
|
+
let next = selector(store.get())
|
|
95
|
+
if (value !== next) {
|
|
96
|
+
value = next
|
|
97
|
+
forceUpdate()
|
|
98
|
+
}
|
|
98
99
|
};
|
|
99
|
-
updateState()
|
|
100
100
|
return store.subscribe(updateState)
|
|
101
101
|
}, selectorDependencies)
|
|
102
102
|
|
|
103
|
-
return
|
|
103
|
+
return value
|
|
104
104
|
}
|
package/store/Store.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare class Store<T> extends AbstractStore<T> {
|
|
|
17
17
|
constructor(initialState: T, name?: string);
|
|
18
18
|
}
|
|
19
19
|
export default Store;
|
|
20
|
-
export declare function getGlobalState(): Map<Symbol, any
|
|
20
|
+
export declare function getGlobalState(): Map<Symbol, Store<any>>;
|
|
21
21
|
export declare type Selector<T, R> = (t: T) => R;
|
|
22
22
|
export declare const defaultSelector: <T>(store: T) => T;
|
|
23
23
|
export declare function useStore<T, R>(store: Store<T>, selector: Selector<T, R>, selectorDependencies: ReadonlyArray<any>): R;
|
package/store/Store.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import ReactConstants from "./../ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./../CommonFields"; import {toConsumableArray as __toConsumableArray} from "./../_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./../_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./../_virtual/_rollupPluginBabelHelpers"; import {
|
|
1
|
+
import ReactConstants from "./../ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./../CommonFields"; import {toConsumableArray as __toConsumableArray} from "./../_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./../_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./../_virtual/_rollupPluginBabelHelpers"; import { useReducer, useEffect } from 'react';
|
|
2
2
|
import { createProxy } from './ProxyTools.js';
|
|
3
3
|
import { isFunction, isObject } from '../Tools.js';
|
|
4
4
|
|
|
@@ -10,37 +10,34 @@ class Store extends AbstractStore {
|
|
|
10
10
|
super();
|
|
11
11
|
let that = this;
|
|
12
12
|
let listeners = new Map();
|
|
13
|
-
let
|
|
13
|
+
let value = initialState;
|
|
14
14
|
let runListeners = () => {
|
|
15
15
|
for (let listener of listeners.values()) {
|
|
16
16
|
listener();
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
|
-
|
|
20
|
-
let reset = () => {
|
|
21
|
-
STORES.set(index, initialState);
|
|
22
|
-
runListeners();
|
|
23
|
-
};
|
|
24
|
-
reset();
|
|
25
|
-
that.get = get;
|
|
19
|
+
that.get = () => value;
|
|
26
20
|
that.set = (setter) => {
|
|
27
21
|
let result;
|
|
28
22
|
if (isFunction(setter)) {
|
|
29
|
-
const proxy = createProxy(
|
|
23
|
+
const proxy = createProxy(value);
|
|
30
24
|
result = setter(proxy);
|
|
31
25
|
if (!result || result === proxy)
|
|
32
26
|
result = proxy.bake();
|
|
33
27
|
}
|
|
34
28
|
else if (isObject(setter)) {
|
|
35
|
-
result = __extends(__extends({},
|
|
29
|
+
result = __extends(__extends({}, value), setter);
|
|
36
30
|
}
|
|
37
31
|
else {
|
|
38
32
|
result = setter;
|
|
39
33
|
}
|
|
40
|
-
|
|
34
|
+
value = result;
|
|
35
|
+
runListeners();
|
|
36
|
+
};
|
|
37
|
+
that.reset = () => {
|
|
38
|
+
value = initialState;
|
|
41
39
|
runListeners();
|
|
42
40
|
};
|
|
43
|
-
that.reset = reset;
|
|
44
41
|
that.subscribe = (fn) => {
|
|
45
42
|
const key = Symbol();
|
|
46
43
|
listeners.set(key, fn);
|
|
@@ -49,6 +46,7 @@ class Store extends AbstractStore {
|
|
|
49
46
|
};
|
|
50
47
|
};
|
|
51
48
|
that.toString = () => name;
|
|
49
|
+
STORES.set(Symbol(), that);
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
52
|
function getGlobalState() {
|
|
@@ -58,15 +56,19 @@ const defaultSelector = (store) => store;
|
|
|
58
56
|
function useStore(store, selector, selectorDependencies = []) {
|
|
59
57
|
if (!selector)
|
|
60
58
|
selector = defaultSelector;
|
|
61
|
-
const [
|
|
59
|
+
const [_, forceUpdate] = useReducer(x => x + 1, 0);
|
|
60
|
+
let value = selector(store.get());
|
|
62
61
|
useEffect(() => {
|
|
63
62
|
const updateState = () => {
|
|
64
|
-
|
|
63
|
+
let next = selector(store.get());
|
|
64
|
+
if (value !== next) {
|
|
65
|
+
value = next;
|
|
66
|
+
forceUpdate();
|
|
67
|
+
}
|
|
65
68
|
};
|
|
66
|
-
updateState();
|
|
67
69
|
return store.subscribe(updateState);
|
|
68
70
|
}, selectorDependencies);
|
|
69
|
-
return
|
|
71
|
+
return value;
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
export { Store, Store as default, defaultSelector, getGlobalState, useStore };
|
package/store/Store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","sources":["../src/store/Store.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA,MAAM,MAAM,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"Store.js","sources":["../src/store/Store.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAA;AAM5C,MAAe,aAAa,CAAA;AAW3B,CAAA;AAGK,MAAO,KAAS,SAAQ,aAAgB,CAAA;IAE1C,WAAY,CAAA,YAAe,EAAE,IAAa,EAAA;AACtC,QAAA,KAAK,EAAE,CAAA;QACP,IAAI,IAAI,GAAG,IAAI,CAAC;AAChB,QAAA,IAAI,SAAS,GAA4B,IAAI,GAAG,EAAsB,CAAA;QACtE,IAAI,KAAK,GAAG,YAAY,CAAC;QACzB,IAAI,YAAY,GAAG,MAAK;AACpB,YAAA,KAAK,IAAI,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE;AACrC,gBAAA,QAAQ,EAAE,CAAA;AACb,aAAA;AACL,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,GAAG,MAAS,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,KAAI;AAClB,YAAA,IAAI,MAAM,CAAC;AACX,YAAA,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE;AACpB,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,KAAe,CAAC,CAAC;AAC3C,gBAAA,MAAM,GAAI,MAAoB,CAAC,KAAK,CAAC,CAAC;AACtC,gBAAA,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK;AAC3B,oBAAA,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;AAC5B,aAAA;AAAM,iBAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;AACzB,gBAAA,MAAM,GAAO,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,KAAK,CAAK,EAAA,MAAM,CAAC,CAAA;AACjC,aAAA;AAAM,iBAAA;gBACH,MAAM,GAAG,MAAM,CAAA;AAClB,aAAA;YAED,KAAK,GAAG,MAAM,CAAA;AACd,YAAA,YAAY,EAAE,CAAC;AACnB,SAAC,CAAA;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,MAAK;YACd,KAAK,GAAG,YAAY,CAAA;AACpB,YAAA,YAAY,EAAE,CAAC;AACnB,SAAC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,EAAc,KAAI;AAChC,YAAA,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;AACrB,YAAA,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACtB,YAAA,OAAO,MAAK;AACR,gBAAA,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACzB,aAAC,CAAA;AACL,SAAC,CAAA;AAED,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAc,IAAI,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;KAC7B;AACJ,CAAA;SAIe,cAAc,GAAA;AAC1B,IAAA,OAAO,MAAM,CAAA;AACjB,CAAC;AAIY,MAAA,eAAe,GAAG,CAAI,KAAQ,KAAQ,MAAM;AAKnD,SAAU,QAAQ,CAAO,KAAe,EAAE,QAAyB,EAAE,uBAA2C,EAAE,EAAA;AACpH,IAAA,IAAI,CAAC,QAAQ;QACT,QAAQ,GAAI,eAAkC,CAAA;AAElD,IAAA,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;IAEjC,SAAS,CAAC,MAAK;QACX,MAAM,WAAW,GAAG,MAAK;YACrB,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;YAChC,IAAI,KAAK,KAAK,IAAI,EAAE;gBAChB,KAAK,GAAG,IAAI,CAAA;AACZ,gBAAA,WAAW,EAAE,CAAA;AAChB,aAAA;AACL,SAAC,CAAC;AACF,QAAA,OAAO,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;KACtC,EAAE,oBAAoB,CAAC,CAAA;AAExB,IAAA,OAAO,KAAK,CAAA;AAChB;;;;"}
|