Skip to content

Commit 326600a

Browse files
xoyseaugcor
andauthored
Apply suggestions from code review
Co-authored-by: Anton Ahatov <[email protected]>
1 parent 507f0a1 commit 326600a

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/content/reference/react/useMemo.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function TodoList({ todos, tab }) {
3434
}
3535
```
3636

37-
[Больше примеров.](#usage)
37+
[Больше примеров ниже.](#usage)
3838

3939
#### Параметры {/*parameters*/}
4040

@@ -50,7 +50,7 @@ function TodoList({ todos, tab }) {
5050

5151
#### Предостережения {/*caveats*/}
5252

53-
* Поскольку `useMemo` это хук, то вызывать его можно только **на верхнем уровне** внутри компонента или кастомного хука. Хуки нельзя вызывать внутри циклов или условий. Однако, если вам необходимо такое поведение, то можно извлечь новый компонент и переместить вызов хука в него.
53+
* Поскольку `useMemo` это хук, то вызывать его можно только **на верхнем уровне внутри вашего компонента** или кастомного хука. Хуки нельзя вызывать внутри циклов или условий. Однако, если вам необходимо такое поведение, то можно извлечь новый компонент и переместить вызов хука в него.
5454
* В строгом режиме React дважды вызовет передаваемую в `useMemo` функцию, чтобы проверить, [является ли она чистой](#my-calculation-runs-twice-on-every-re-render). Такое поведение существует только в режиме разработки и никак не проявляется в продакшене. Если эта функция чистая (какой она и должна быть), это никак не скажется на работе приложения. Результат одного из запусков будет просто проигнорирован.
5555
* React **не отбрасывает закешированное значение, если на то нет веских причин**. Например, в режиме разработки React отбросит кеш, если файл компонента был изменён. В обоих режимах, разработки и продакшене, React отбросит кеш, если компонент [«задержится»](/reference/react/Suspense) во время первоначального монтирования. Помимо того, в дальнейшем в React могут быть добавлены новые возможности, которые смогут отбрасывать кеш. Например, если в будущем в React появится встроенная поддержка виртуализированных списков, будет иметь смысл отбрасывать кеш для тех элементов, которые выходят за область видимости. Полагаться на `useMemo` стоит только как на средство для оптимизации производительности. В противном случае, использование [состояния](/reference/react/useState#avoiding-recreating-the-initial-state) или [рефа](/reference/react/useRef#avoiding-recreating-the-ref-contents) может быть более подходящим вариантом.
5656

@@ -156,8 +156,8 @@ console.timeEnd('filter array');
156156
**Излишней мемоизации можно избежать, следуя таким принципам:**
157157

158158
1. Когда один компонент визуально оборачивает другие компоненты, ему можно передать весь этот [JSX в виде дочерних компонентов](/learn/passing-props-to-a-component#passing-jsx-as-children). В таком случае, когда родительский компонент обновляет своё состояние, React будет знать, что дочерние компоненты не нуждаются в ререндере.
159-
1. Храните состояние как можно локальнее и не [поднимайте его выше](/learn/sharing-state-between-components), чем это действительно необходимо. Не храните переходные состояния типа форм или проверок на hover в библиотеке для управления глобальным состоянием или на самом верху вашего дерева компонентов.
160-
1. Храните ваши компоненты [чистыми](/learn/keeping-components-pure). Если ререндер компонента приводит к проблемам или производит какие-то визуальные артефакты – это баг! Исправьте его, а не прибегайте к мемоизации.
159+
1. Предпочитайте локальное состояние и не [поднимайте его выше](/learn/sharing-state-between-components), чем это действительно необходимо. Не храните переходные состояния типа форм или проверок на hover в библиотеке для управления глобальным состоянием или на самом верху вашего дерева компонентов.
160+
1. Держите ваши компоненты [чистыми](/learn/keeping-components-pure). Если ререндер компонента приводит к проблемам или производит какие-то визуальные артефакты – это баг! Исправьте его, а не прибегайте к мемоизации.
161161
1. Избейгате лишних [Эффектов, которые обновляют состояние](/learn/you-might-not-need-an-effect). В React-приложениях большинство проблем с производительностью вызваны цепочками обновлений, которые создаются в Эффектах и вынуждают компоненты ререндериться снова и снова.
162162
1. Постарайтесь [убрать лишние зависимости в Эффектах](/learn/removing-effect-dependencies). Иногда проще перенести функцию или объект внутрь функции Эффекта, или вынести их за пределы компонента, чем прибегать к мемоизации.
163163

@@ -591,7 +591,7 @@ export default function TodoList({ todos, tab, theme }) {
591591
}
592592
```
593593

594-
Подобно тому как объектный литерал `{}` всегда создаёт новый объект, **функция `filterTodos` всегда создаёт новый массив**. Это значит, что компонент `List` всегда будет получать новые пропсы, и оптимизация при помощи [`memo`](/reference/react/memo) не работает. Здесь на помощь приходит `useMemo`:
594+
**В примере ниже функция `filterTodos` всегда создаёт новый массив**, подобно тому как объектный литерал `{}` всегда создаёт новый объект. Это значит, что компонент `List` всегда будет получать новые пропсы, и оптимизация при помощи [`memo`](/reference/react/memo) не работает. Здесь на помощь приходит `useMemo`:
595595

596596
```js {2-3,5,9-10}
597597
export default function TodoList({ todos, tab, theme }) {
@@ -643,11 +643,11 @@ JSX-узел `<List items={visibleTodos} />` является простым о
643643

644644
#### Пропуск ререндеров при помощи `useMemo` и `memo` {/*skipping-re-rendering-with-usememo-and-memo*/}
645645

646-
В данном примере компонент `List` искусственно замедлен, чтобы показать, что случается в том случае, если React-компонент действительно медленный. Попробуйте попереключаться между вкладками и попереключать тему.
646+
В данном примере компонент `List` **искусственно замедлен**, чтобы показать, что случается в том случае, если React-компонент действительно медленный. Попробуйте переключить вкладки и переключить тему.
647647

648648
Переключение между вкладками ощущается таким медленным, потому что оно вынуждает замедленный компонент `List` ререндериться. Такое поведение ожидаемо, поскольку проп `tab` изменился, и новые данные необходимо отобразить на экране.
649649

650-
Однако изменение темы (благодаря `useMemo` в связке с [`memo`](/reference/react/memo)) происходит быстро, несмотря на искусственное замедление. Поскольку ни `todos`, ни `tab`, указанные как зависимости в `useMemo`, не изменились с предыдущего рендера, то массив `visibleTodos` остался прежним, и компонент `List` пропустил ререндер.
650+
Затем попробуйте переключить тему. **Благодаря `useMemo` в связке с [`memo`](/reference/react/memo) это происходит быстро, несмотря на искусственное замедление.** Поскольку ни `todos`, ни `tab`, указанные как зависимости в `useMemo`, не изменились с предыдущего рендера, то массив `visibleTodos` остался прежним, и компонент `List` пропустил ререндер.
651651

652652
<Sandpack>
653653

@@ -1066,7 +1066,7 @@ function Dropdown({ allItems, text }) {
10661066

10671067
const visibleItems = useMemo(() => {
10681068
return searchItems(allItems, searchOptions);
1069-
}, [allItems, searchOptions]); // 🚩 Зависимость от объекта, создаваемого внутри компонента
1069+
}, [allItems, searchOptions]); // 🚩 Обратите внимание: зависимость от объекта, создаваемого внутри компонента
10701070
// ...
10711071
```
10721072
@@ -1182,7 +1182,7 @@ function TodoList({ todos, tab }) {
11821182
11831183
```js {2-3}
11841184
const visibleTodos = useMemo(() => {
1185-
// 🚩 Внимание: мутация пропса
1185+
// 🚩 Ошибка: мутация пропса
11861186
todos.push({ id: 'last', text: 'Go for a walk!' });
11871187
const filtered = filterTodos(todos, tab);
11881188
return filtered;

0 commit comments

Comments
 (0)