@@ -52,7 +52,13 @@ const handleMouseLeave = () => setIsHovered(false);
52
52
53
53
<!-- v -->
54
54
55
- HOC
55
+ HOC (Higher-Order Components)
56
+
57
+ - Функция, которая принимает компонент и возвращает новый компонент
58
+ - Позволяет добавлять логику "снаружи"
59
+ - Используется для переиспользования поведения
60
+
61
+ <!-- v -->
56
62
57
63
``` jsx
58
64
function withHover (WrappedComponent ) {
@@ -78,8 +84,27 @@ export default withHover(MyComponent);
78
84
79
85
<!-- v -->
80
86
87
+ Плюсы:
88
+
89
+ - Разделение обязанностей (UI отдельно, логика отдельно)
90
+ - Легко оборачивать несколько компонентов
91
+
92
+ Минусы:
93
+
94
+ - "Wrapper hell" (дерево компонентов сильно усложняется)
95
+ - Возможны конфликты props
96
+ - Логика скрыта внутри обёртки
97
+
98
+ <!-- v -->
99
+
81
100
Render Props
82
101
102
+ - Компонент принимает функцию как child
103
+ - Эта функция управляет тем, что будет отрисовано
104
+ - Позволяет гибко делиться состоянием и поведением
105
+
106
+ <!-- v -->
107
+
83
108
``` jsx
84
109
function Hover ({ children }) {
85
110
const [isHovered , setIsHovered ] = useState (false );
@@ -106,14 +131,20 @@ function App() {
106
131
107
132
<!-- v -->
108
133
109
- Оба подхода рабочие, но имеют недостатки :
134
+ Плюсы :
110
135
111
- - "Wrapper Hell": Дерево компонентов разрастается за счет оберток.
112
- - Неявные зависимости: Сложно понять, откуда приходят props.
113
- - Конфликты имен: Props от разных HOC могут перезаписывать друг друга.
136
+ - Гибкость — родитель решает, как отрисовать
137
+ - Чёткий контроль над данными
138
+
139
+ Минусы:
140
+
141
+ - Синтаксис иногда "шумный"
142
+ - Легко создать "пирамиду функций"
114
143
115
144
<!-- v -->
116
145
146
+ Оба подхода рабочие, но имеют недостатки
147
+
117
148
Хуки предложили более элегантное решение.
118
149
119
150
<!-- v -->
@@ -218,26 +249,25 @@ function UserProfile() {
218
249
Создаем хук useRequest
219
250
220
251
``` jsx
221
- Копировать код
222
- import { useState , useEffect } from ' react' ;
252
+ import { useState , useEffect } from " react" ;
223
253
224
254
export function useRequest (url ) {
225
- const [data , setData ] = useState (null );
226
- const [isLoading , setIsLoading ] = useState (true );
227
- const [error , setError ] = useState (null );
228
-
229
- useEffect (() => {
230
- if (! url) return ;
231
-
232
- setIsLoading (true );
233
- fetch (url)
234
- .then (res => res .json ())
235
- .then (data => setData (data))
236
- .catch (err => setError (err))
237
- .finally (() => setIsLoading (false ));
238
- }, [url]);
239
-
240
- return { data, isLoading, error };
255
+ const [data , setData ] = useState (null );
256
+ const [isLoading , setIsLoading ] = useState (true );
257
+ const [error , setError ] = useState (null );
258
+
259
+ useEffect (() => {
260
+ if (! url) return ;
261
+
262
+ setIsLoading (true );
263
+ fetch (url)
264
+ .then (( res ) => res .json ())
265
+ .then (( data ) => setData (data))
266
+ .catch (( err ) => setError (err))
267
+ .finally (() => setIsLoading (false ));
268
+ }, [url]);
269
+
270
+ return { data, isLoading, error };
241
271
}
242
272
```
243
273
@@ -267,10 +297,9 @@ function UserProfile({ userId }) {
267
297
хук useInput
268
298
269
299
` ` ` jsx
270
- Копировать код
271
300
function useInput (initial = " " ) {
272
301
const [value , setValue ] = useState (initial);
273
- const onChange = e => setValue (e .target .value );
302
+ const onChange = ( e ) => setValue (e .target .value );
274
303
return { value, onChange };
275
304
}
276
305
` ` `
0 commit comments