1
1
import { useState } from 'react'
2
2
import logo from './logo.svg'
3
3
import './App.css'
4
- import { MultiProvider , Provider , useNamedProvider , useProvider } from 'react-scoped-provider'
4
+ import {
5
+ Controller ,
6
+ ControllerProvider ,
7
+ useBuilder ,
8
+ useListener ,
9
+ useProvider ,
10
+ useSelector ,
11
+ } from 'react-state-view-controller'
5
12
6
- class Counter {
13
+ type MultiCounterState = {
7
14
count : number
8
- constructor ( count : number ) {
9
- this . count = count
15
+ count2 : number
16
+ }
17
+
18
+ class MultiCounterController extends Controller < MultiCounterState > {
19
+ constructor ( ) {
20
+ super ( { count : 0 , count2 : 0 } )
21
+ }
22
+
23
+ inc ( ) {
24
+ this . emit ( { count : this . state . count + 1 } )
10
25
}
26
+ inc2 ( ) {
27
+ this . emit ( { count2 : this . state . count2 + 1 } )
28
+ }
29
+ }
30
+
31
+ const ControllerConsumer = ( ) => {
32
+ const controller = useProvider ( MultiCounterController )
33
+ return < h2 data-testid = 'controller-consumer' > { controller !== undefined ? 'Controller existed!' : '' } </ h2 >
11
34
}
12
35
13
- type CustomData = {
14
- field : number
15
- field2 : string
36
+ const ListenerConsumer = ( ) => {
37
+ const controller = useListener ( MultiCounterController , ( state ) => console . log ( state ) )
38
+ console . log ( 'render listner' )
39
+ return < h2 data-testid = 'controller-listener' > Listenner mounted</ h2 >
16
40
}
17
41
18
- const Consumer = ( ) => {
19
- const count = useProvider ( Number )
20
- const text = useProvider ( String )
21
- const truth = useProvider ( Boolean )
22
- const counter = useProvider ( Counter )
23
- const customData = useNamedProvider < CustomData > ( 'customData' )
42
+ const CounterConsumer = ( ) => {
43
+ const [ state , controller ] = useBuilder ( MultiCounterController )
44
+ console . log ( 'render builder' )
24
45
return (
25
46
< div >
26
- < h2 data-testid = 'counter-value' > This should update on btn clicked: { count } </ h2 >
27
- < h2 data-testid = 'string' > Provided String: { text } </ h2 >
28
- < h2 data-testid = 'boolean' > Provided Boolean: { truth ? 'true' : 'false' } </ h2 >
29
- < h2 data-testid = 'counter-create' > This should NOT update on btn clicked: { counter . count } </ h2 >
30
- < h2 data-testid = 'custom-data' >
31
- Custom data: { customData . field } -{ customData . field2 }
32
- </ h2 >
47
+ < h2 data-testid = 'counter-text' > Counter: { state . count } </ h2 >
48
+ < button onClick = { ( ) => controller . inc ( ) } data-testid = 'counter-btn' >
49
+ Inc counter
50
+ </ button >
51
+ </ div >
52
+ )
53
+ }
54
+
55
+ const Counter2Consumer = ( ) => {
56
+ const [ state , controller ] = useSelector ( MultiCounterController , ( state ) => state . count2 )
57
+ console . log ( 'render-selector' )
58
+ return (
59
+ < div >
60
+ < h2 data-testid = 'counter2-text' > Counter2: { state } </ h2 >
61
+ < button onClick = { ( ) => controller . inc2 ( ) } data-testid = 'counter2-btn' >
62
+ Inc counter2
63
+ </ button >
33
64
</ div >
34
65
)
35
66
}
36
67
37
68
function App ( ) {
38
- const [ count , setCount ] = useState ( 0 )
39
- const customData : CustomData = {
40
- field : 3 ,
41
- field2 : 'hello' ,
42
- }
43
69
return (
44
- < MultiProvider
45
- providers = { [
46
- < Provider source = { count } /> ,
47
- < Provider source = { 'test-string' } /> ,
48
- < Provider source = { true } /> ,
49
- < Provider source = { ( ) => new Counter ( count + 1 ) } /> ,
50
- < Provider source = { customData } name = 'customData' /> ,
51
- ] }
52
- >
70
+ < ControllerProvider source = { ( ) => new MultiCounterController ( ) } >
53
71
< div className = 'App' >
54
72
< header className = 'App-header' >
55
73
< img src = { logo } className = 'App-logo' alt = 'logo' />
@@ -59,13 +77,13 @@ function App() {
59
77
< a className = 'App-link' href = 'https://reactjs.org' target = '_blank' rel = 'noopener noreferrer' >
60
78
Learn React
61
79
</ a >
62
- < button className = 'App-button' data-testid = 'btn' onClick = { ( ) => setCount ( ( value ) => value + 1 ) } >
63
- Inc
64
- </ button >
65
- < Consumer />
80
+ < ControllerConsumer / >
81
+ < ListenerConsumer />
82
+ < CounterConsumer / >
83
+ < Counter2Consumer />
66
84
</ header >
67
85
</ div >
68
- </ MultiProvider >
86
+ </ ControllerProvider >
69
87
)
70
88
}
71
89
0 commit comments