Commit ecd61b8 1 parent 3123e7f commit ecd61b8 Copy full SHA for ecd61b8
File tree 5 files changed +214
-2
lines changed
5 files changed +214
-2
lines changed Original file line number Diff line number Diff line change @@ -25,6 +25,8 @@ import SuspenseRouterBug from './suspense-router';
25
25
import NestedSuspenseBug from './nested-suspense' ;
26
26
import Contenteditable from './contenteditable' ;
27
27
import { MobXDemo } from './mobx' ;
28
+ import Zustand from './zustand' ;
29
+ import ReduxToolkit from './redux_toolkit' ;
28
30
29
31
let isBenchmark = / ( \/ s p i r a l | \/ p y t h a g o r a s | [ # & ] b e n c h ) / g. test (
30
32
window . location . href
@@ -135,6 +137,12 @@ class App extends Component {
135
137
< Link href = "/contenteditable" activeClassName = "active" >
136
138
contenteditable
137
139
</ Link >
140
+ < Link href = "/zustand" activeClassName = "active" >
141
+ zustand
142
+ </ Link >
143
+ < Link href = "/redux-toolkit" activeClassName = "active" >
144
+ redux-toolkit
145
+ </ Link >
138
146
</ nav >
139
147
</ header >
140
148
< main >
@@ -165,6 +173,8 @@ class App extends Component {
165
173
< SuspenseRouterBug path = "/suspense-router" />
166
174
< NestedSuspenseBug path = "/nested-suspense" />
167
175
< Contenteditable path = "/contenteditable" />
176
+ < Zustand path = "/zustand" />
177
+ < ReduxToolkit path = "/redux-toolkit" />
168
178
</ Router >
169
179
</ main >
170
180
</ div >
Original file line number Diff line number Diff line change 14
14
},
15
15
"dependencies" : {
16
16
"@material-ui/core" : " 4.9.5" ,
17
+ "@reduxjs/toolkit" : " ^2.2.3" ,
17
18
"d3-scale" : " ^1.0.7" ,
18
19
"d3-selection" : " ^1.2.0" ,
19
20
"htm" : " 2.1.1" ,
26
27
"react-router" : " ^5.0.1" ,
27
28
"react-router-dom" : " ^5.0.1" ,
28
29
"redux" : " ^4.0.1" ,
29
- "styled-components" : " ^4.2.0"
30
+ "styled-components" : " ^4.2.0" ,
31
+ "zustand" : " ^4.5.2"
30
32
},
31
33
"volta" : {
32
34
"extends" : " ../package.json"
Original file line number Diff line number Diff line change
1
+ import { createElement } from 'preact' ;
2
+ import { Provider , useSelector } from 'react-redux' ;
3
+ import { configureStore , createSlice } from '@reduxjs/toolkit' ;
4
+
5
+ const initialState = {
6
+ value : 0
7
+ } ;
8
+ const counterSlice = createSlice ( {
9
+ name : 'counter' ,
10
+ initialState,
11
+ reducers : {
12
+ increment : state => {
13
+ state . value += 1 ;
14
+ } ,
15
+ decrement : state => {
16
+ state . value -= 1 ;
17
+ }
18
+ }
19
+ } ) ;
20
+ const store = configureStore ( {
21
+ reducer : {
22
+ counter : counterSlice . reducer
23
+ }
24
+ } ) ;
25
+
26
+ function Counter ( { number } ) {
27
+ const count = useSelector ( state => state . counter . value ) ;
28
+ return (
29
+ < div >
30
+ Counter #{ number } :{ count }
31
+ </ div >
32
+ ) ;
33
+ }
34
+
35
+ export default function ReduxToolkit ( ) {
36
+ function increment ( ) {
37
+ store . dispatch ( counterSlice . actions . increment ( ) ) ;
38
+ }
39
+ function decrement ( ) {
40
+ store . dispatch ( counterSlice . actions . decrement ( ) ) ;
41
+ }
42
+ function incrementAsync ( ) {
43
+ setTimeout ( ( ) => {
44
+ store . dispatch ( counterSlice . actions . increment ( ) ) ;
45
+ } , 1000 ) ;
46
+ }
47
+ return (
48
+ < Provider store = { store } >
49
+ < div >
50
+ < h1 > Redux Toolkit</ h1 >
51
+ < h1 > Counter</ h1 >
52
+ < Counter number = { 1 } />
53
+ < Counter number = { 2 } />
54
+ < button onClick = { increment } > +</ button >
55
+ < button onClick = { decrement } > -</ button >
56
+ < button onClick = { incrementAsync } > Increment Async</ button >
57
+ </ div >
58
+ </ Provider >
59
+ ) ;
60
+ }
Original file line number Diff line number Diff line change
1
+ import { createElement } from 'preact' ;
2
+ import create from 'zustand' ;
3
+
4
+ const useStore = create ( set => ( {
5
+ value : 0 ,
6
+ text : 'John' ,
7
+ setText : text => set ( state => ( { ...state , text } ) ) ,
8
+ increment : ( ) => set ( state => ( { value : state . value + 1 } ) ) ,
9
+ decrement : ( ) => set ( state => ( { value : state . value - 1 } ) ) ,
10
+ incrementAsync : async ( ) => {
11
+ await new Promise ( resolve => setTimeout ( resolve , 1000 ) ) ;
12
+ set ( state => ( { value : state . value + 1 } ) ) ;
13
+ }
14
+ } ) ) ;
15
+
16
+ function Counter ( { number } ) {
17
+ const value = useStore ( state => state . value ) ;
18
+ return (
19
+ < div >
20
+ Counter #{ number } : { value }
21
+ </ div >
22
+ ) ;
23
+ }
24
+ function Text ( ) {
25
+ const text = useStore ( state => state . text ) ;
26
+ const { setText } = useStore ( ) ;
27
+ function handleInput ( e ) {
28
+ setText ( e . target . value ) ;
29
+ }
30
+ return (
31
+ < div >
32
+ Text: { text }
33
+ < input value = { text } onInput = { handleInput } />
34
+ </ div >
35
+ ) ;
36
+ }
37
+
38
+ export default function ZustandComponent ( ) {
39
+ const { increment, decrement, incrementAsync } = useStore ( ) ;
40
+
41
+ return (
42
+ < div >
43
+ < h1 > Zustand</ h1 >
44
+ < h1 > Counter</ h1 >
45
+ < Counter number = { 1 } />
46
+ < Counter number = { 2 } />
47
+ < button onClick = { increment } > +</ button >
48
+ < button onClick = { decrement } > -</ button >
49
+ < button onClick = { incrementAsync } > Increment Async</ button >
50
+ < Text />
51
+ </ div >
52
+ ) ;
53
+ }
You can’t perform that action at this time.
0 commit comments