Skip to content

Commit 35f86a0

Browse files
authored
Merge pull request #16 from JavaScript-Basic-OTUS/fix-lesson32-add-slides
add slydes to lesson 32
2 parents 6c6175e + 80592e7 commit 35f86a0

File tree

1 file changed

+54
-25
lines changed

1 file changed

+54
-25
lines changed

lessons/lesson32/lesson.md

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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
5864
function 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+
81100
Render Props
82101

102+
- Компонент принимает функцию как child
103+
- Эта функция управляет тем, что будет отрисовано
104+
- Позволяет гибко делиться состоянием и поведением
105+
106+
<!-- v -->
107+
83108
```jsx
84109
function 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

224254
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 };
241271
}
242272
```
243273

@@ -267,10 +297,9 @@ function UserProfile({ userId }) {
267297
хук useInput
268298
269299
```jsx
270-
Копировать код
271300
function 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

Comments
 (0)