Check this post
Example code
This example demonstrate one single feature using four different feature to archive code split
Code running there: –>Link<–
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
| import { useState, useEffect } from React;
const Styles = {
redBorder: {
border: '1px solid #f00',
},
};
const MouseDisplay = ({ x, y }) => {
return (
<div>
Mouse at x: {x} ; y: {y}
</div>
);
};
const MouseDisplay2 = ({ x, y }) => {
return (
<div style={{ color: 'teal' }}>
Mouse at x: {x} ; y: {y}
</div>
);
};
// Normal
export const MouseInfoAndDisplay = () => {
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const handleMove = (e) => {
setX(e.clientX);
setY(e.clientY);
};
return (
<div style={Styles.redBorder} onMouseMove={handleMove}>
<MouseDisplay x={x} y={y} />
</div>
);
};
// HOC
const withMouseInfo = (Component) => {
return (props) => {
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const handleMove = (e) => {
setX(e.clientX);
setY(e.clientY);
};
return (
<div style={Styles.redBorder} onMouseMove={handleMove}>
<Component {...props} x={x} y={y} />
</div>
);
};
};
export const HOCMouseDisplay = withMouseInfo(MouseDisplay);
export const HOCMouseDisplay2 = withMouseInfo(MouseDisplay2);
// Render Props
const MouseRenderProps = ({ render }) => {
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const handleMove = (e) => {
setX(e.clientX);
setY(e.clientY);
};
return (
<div style={Styles.redBorder} onMouseMove={handleMove}>
{render(x, y)}
</div>
);
};
export const Mouse = () => {
return (
<div>
<MouseRenderProps render={(x, y) => <MouseDisplay x={x} y={y} />} />
<MouseRenderProps
render={(x, y) => <MouseDisplay2 x={x} y={y} />}
/>
</div>
);
};
// Customize HOOK
const useMouseState = () => {
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const [node, setNode] = useState(null);
const handleMove = (e) => {
setX(e.clientX);
setY(e.clientY);
};
useEffect(() => {
if (node !== null) {
node.addEventListener('mousemove', handleMove);
}
}, [node]);
return [x, y, setNode];
};
export const MouseUsingHook = () => {
const [x1, y1, ref1] = useMouseState();
const [x2, y2, ref2] = useMouseState();
return (
<div>
<div ref={ref1} style={Styles.redBorder}>
<MouseDisplay x={x1} y={y1} />
</div>
<div ref={ref2} style={Styles.redBorder}>
<MouseDisplay2 x={x2} y={y2} />
</div>
</div>
);
};
const App = () => {
return (
<div
style={{
display: 'flex',
flexDirection: 'column',
height: '100vh',
justifyContent: 'space-around',
}}
>
<div>
Normal: <MouseInfoAndDisplay />
</div>
<div>
HOC: <HOCMouseDisplay /> <HOCMouseDisplay2/>
</div>
<div>
Render Props: <Mouse />
</div>
<div>
Hook: <MouseUsingHook />
</div>
</div>
);
};
|