@@ -52,7 +52,13 @@ const handleMouseLeave = () => setIsHovered(false);
5252
5353<!-- v -->
5454
55- HOC
55+ HOC (Higher-Order Components)
56+
57+ - Функция, которая принимает компонент и возвращает новый компонент
58+ - Позволяет добавлять логику "снаружи"
59+ - Используется для переиспользования поведения
60+
61+ <!-- v -->
5662
5763``` jsx
5864function withHover (WrappedComponent ) {
@@ -78,8 +84,27 @@ export default withHover(MyComponent);
7884
7985<!-- v -->
8086
87+ Плюсы:
88+
89+ - Разделение обязанностей (UI отдельно, логика отдельно)
90+ - Легко оборачивать несколько компонентов
91+
92+ Минусы:
93+
94+ - "Wrapper hell" (дерево компонентов сильно усложняется)
95+ - Возможны конфликты props
96+ - Логика скрыта внутри обёртки
97+
98+ <!-- v -->
99+
81100Render Props
82101
102+ - Компонент принимает функцию как child
103+ - Эта функция управляет тем, что будет отрисовано
104+ - Позволяет гибко делиться состоянием и поведением
105+
106+ <!-- v -->
107+
83108``` jsx
84109function Hover ({ children }) {
85110 const [isHovered , setIsHovered ] = useState (false );
@@ -106,14 +131,20 @@ function App() {
106131
107132<!-- v -->
108133
109- Оба подхода рабочие, но имеют недостатки :
134+ Плюсы :
110135
111- - "Wrapper Hell": Дерево компонентов разрастается за счет оберток.
112- - Неявные зависимости: Сложно понять, откуда приходят props.
113- - Конфликты имен: Props от разных HOC могут перезаписывать друг друга.
136+ - Гибкость — родитель решает, как отрисовать
137+ - Чёткий контроль над данными
138+
139+ Минусы:
140+
141+ - Синтаксис иногда "шумный"
142+ - Легко создать "пирамиду функций"
114143
115144<!-- v -->
116145
146+ Оба подхода рабочие, но имеют недостатки
147+
117148Хуки предложили более элегантное решение.
118149
119150<!-- v -->
@@ -218,26 +249,25 @@ function UserProfile() {
218249Создаем хук useRequest
219250
220251``` jsx
221- Копировать код
222- import { useState , useEffect } from ' react' ;
252+ import { useState , useEffect } from " react" ;
223253
224254export 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 };
241271}
242272```
243273
@@ -267,10 +297,9 @@ function UserProfile({ userId }) {
267297хук useInput
268298
269299` ` ` jsx
270- Копировать код
271300function useInput (initial = " " ) {
272301 const [value , setValue ] = useState (initial);
273- const onChange = e => setValue (e .target .value );
302+ const onChange = ( e ) => setValue (e .target .value );
274303 return { value, onChange };
275304}
276305` ` `
0 commit comments