Skip to content

Commit ecd61b8

Browse files
Add zustand and redux-toolkit to the demo.
Co-authored-by: Morteza Mirjavadi <morteza.mirjavadi@yahoo.com>
1 parent 3123e7f commit ecd61b8

File tree

5 files changed

+214
-2
lines changed

5 files changed

+214
-2
lines changed

demo/index.jsx

+10
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import SuspenseRouterBug from './suspense-router';
2525
import NestedSuspenseBug from './nested-suspense';
2626
import Contenteditable from './contenteditable';
2727
import { MobXDemo } from './mobx';
28+
import Zustand from './zustand';
29+
import ReduxToolkit from './redux_toolkit';
2830

2931
let isBenchmark = /(\/spiral|\/pythagoras|[#&]bench)/g.test(
3032
window.location.href
@@ -135,6 +137,12 @@ class App extends Component {
135137
<Link href="/contenteditable" activeClassName="active">
136138
contenteditable
137139
</Link>
140+
<Link href="/zustand" activeClassName="active">
141+
zustand
142+
</Link>
143+
<Link href="/redux-toolkit" activeClassName="active">
144+
redux-toolkit
145+
</Link>
138146
</nav>
139147
</header>
140148
<main>
@@ -165,6 +173,8 @@ class App extends Component {
165173
<SuspenseRouterBug path="/suspense-router" />
166174
<NestedSuspenseBug path="/nested-suspense" />
167175
<Contenteditable path="/contenteditable" />
176+
<Zustand path="/zustand" />
177+
<ReduxToolkit path="/redux-toolkit" />
168178
</Router>
169179
</main>
170180
</div>

demo/package-lock.json

+88-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
},
1515
"dependencies": {
1616
"@material-ui/core": "4.9.5",
17+
"@reduxjs/toolkit": "^2.2.3",
1718
"d3-scale": "^1.0.7",
1819
"d3-selection": "^1.2.0",
1920
"htm": "2.1.1",
@@ -26,7 +27,8 @@
2627
"react-router": "^5.0.1",
2728
"react-router-dom": "^5.0.1",
2829
"redux": "^4.0.1",
29-
"styled-components": "^4.2.0"
30+
"styled-components": "^4.2.0",
31+
"zustand": "^4.5.2"
3032
},
3133
"volta": {
3234
"extends": "../package.json"

demo/redux-toolkit.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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+
}

demo/zustand.js

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
}

0 commit comments

Comments
 (0)