You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/docs/error-boundaries.md
+13-15Lines changed: 13 additions & 15 deletions
Original file line number
Diff line number
Diff line change
@@ -4,25 +4,24 @@ title: Предохранители
4
4
permalink: docs/error-boundaries.html
5
5
---
6
6
7
-
Ранее, ошибки JavaScript внутри компонентов портили внутреннее состояние React и заставляли его [выдавать](https://github.com/facebook/react/issues/4026)[таинственные](https://github.com/facebook/react/issues/6895)[сообщения об ошибках](https://github.com/facebook/react/issues/8579) во время следующего рендера. Эти сообщения всегда вызывались ошибками, расположенными где-то выше в коде приложения, но React не предоставлял способа адекватно обрабатывать их в компонентах и не мог обработать их самостоятельно.
8
-
7
+
Ранее ошибки JavaScript внутри компонентов портили внутреннее состояние React и заставляли его [выдавать](https://github.com/facebook/react/issues/4026)[таинственные](https://github.com/facebook/react/issues/6895)[сообщения об ошибках](https://github.com/facebook/react/issues/8579) во время следующего рендера. Эти сообщения всегда вызывались ошибками, расположенными где-то выше в коде приложения, но React не предоставлял способа адекватно обрабатывать их в компонентах и не мог обработать их самостоятельно.
Ошибка JavaScript где-то в коде UI не должна прерывать работу всего приложения. Чтобы исправить эту проблему для React-пользователей, React 16 ввводит концепцию "предохранитель" (error boundary).
11
+
Ошибка JavaScript где-то в коде UI не должна прерывать работу всего приложения. Чтобы исправить эту проблему для React-пользователей, React 16 ввводит концепцию "предохранителя" (error boundary).
13
12
14
-
Предохранители это компоненты React, которые **отлавливают ошибки JavaScript в любом месте дерева их дочерних компонентов, сохраняют их в журнале ошибок и выводят запасной UI** вместо рухнувшего дерева компонентов. Предохранители отлавливают ошибки при рендеринге, в методах жизненного цикла и конструкторах дерева компонентов, расположенного под ними.
13
+
Предохранители это компоненты React, которые **отлавливают ошибки JavaScript в любом месте деревьев их дочерних компонентов, сохраняют их в журнале ошибок и выводят запасной UI** вместо рухнувшего дерева компонентов. Предохранители отлавливают ошибки при рендеринге, в методах жизненного цикла и конструкторах деревьев компонентов, расположенных под ними.
15
14
16
15
> Примечание
17
16
>
18
17
> Предохранители **не** поймают ошибки в:
19
18
>
20
-
> *Обработчиках событий ([подробнее](#how-about-event-handlers))
21
-
> *Асинхронном коде (например колбэках из `setTimeout` или `requestAnimationFrame`)
22
-
> *Серверном рендеринге (Server-side rendering)
23
-
> *Самом предохранителе (а не в его дочерних компонентах)
19
+
> *обработчиках событий ([подробнее](#how-about-event-handlers));
20
+
> *асинхронном коде (например колбэках из `setTimeout` или `requestAnimationFrame`);
21
+
> *серверном рендеринге (Server-side rendering);
22
+
> *самом предохранителе (а не в его дочерних компонентах).
24
23
25
-
Классовый компонент является предохранителем, если он включает любой (или оба) из следующих методов жизненного цикла: [`static getDerivedStateFromError()`](/docs/react-component.html#static-getderivedstatefromerror) или [`componentDidCatch()`](/docs/react-component.html#componentdidcatch). Используйте `static getDerivedStateFromError()` при рендеринге запасного UI в случае отлова ошибки. Используйте `componentDidCatch()` при написании кода для журналирования информации об отловленной ошибке.
24
+
Классовый компонент является предохранителем, если он включает хотя бы один из следующих методов жизненного цикла: [`static getDerivedStateFromError()`](/docs/react-component.html#static-getderivedstatefromerror) или [`componentDidCatch()`](/docs/react-component.html#componentdidcatch). Используйте `static getDerivedStateFromError()` при рендеринге запасного UI в случае отлова ошибки. Используйте `componentDidCatch()` при написании кода для журналирования информации об отловленной ошибке.
26
25
27
26
```js{7-10,12-15,18-21}
28
27
class ErrorBoundary extends React.Component {
@@ -62,7 +61,7 @@ class ErrorBoundary extends React.Component {
62
61
63
62
Предохранители работают как JavaScript-блоки `catch {}`, но только для компонентов. Только классовые компоненты могут выступать в роли предохранителей. На практике чаще всего целесообразным будет один раз описать предохранитель и дальше использовать его по всему приложению.
64
63
65
-
Стоит обратить внимание, что **предохранители отлавливают ошибки исключительно в своих дочерних компонентах**. Предохранитель не сможет отловить ошибку внутри самого себя. Если предохранителю не удается отрендерить сообщение об ошибке, то ошибка всплывает до ближайшего предохранителя, расположенного над ним в дереве компонентов. Этот аспект их поведения тоже напоминает работу блоков `catch {}` в JavaScript.
64
+
Обратите внимание, что **предохранители отлавливают ошибки исключительно в своих дочерних компонентах**. Предохранитель не сможет отловить ошибку внутри самого себя. Если предохранителю не удается отрендерить сообщение об ошибке, то ошибка всплывает до ближайшего предохранителя, расположенного над ним в дереве компонентов. Этот аспект их поведения тоже напоминает работу блоков `catch {}` в JavaScript.
66
65
67
66
## Живой пример {#live-demo}
68
67
@@ -89,7 +88,7 @@ class ErrorBoundary extends React.Component {
В режиме разработки React 16 выводит на консоль сообщения обо всех ошибках, возникших при рендеринге, даже если приложения случайно их проглотило. Помимо сообщения об ошибке и стека JavaScript, React 16 также выводит и стек вызовов компонентов. Теперь вы в точности можете видеть в каком именно месте дерева компонентов случилось страшное:
91
+
В режиме разработки React 16 выводит на консоль сообщения обо всех ошибках, возникших при рендеринге, даже если они никак не сказались на работе приложения. Помимо сообщения об ошибке и стека JavaScript, React 16 также выводит и стек вызовов компонентов. Теперь вы в точности можете видеть в каком именно месте дерева компонентов случилось страшное:
@@ -101,12 +100,11 @@ class ErrorBoundary extends React.Component {
101
100
102
101
> Примечание
103
102
>
104
-
> Имена компонентов, выводимые в их стеке вызовов, определяются свойством [`Function.name`](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/name). Если ваше приложение поддерживает более старые браузеры и устройства, которые могут ещё не предоставлять его нативно (например, IE 11), рассмотрите возможность включения полифилла `Function.name` в бандл вашего приложения, например [`function.name-polyfill`](https://github.com/JamesMGreene/Function.name). В качстве альтернативы, вы можете явным образом задать проп [`displayName`](/docs/react-component.html#displayname) в каждом из ваших компонентов.
105
-
103
+
> Имена компонентов, выводимые в их стеке вызовов, определяются свойством [`Function.name`](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/name). Если ваше приложение поддерживает более старые браузеры и устройства, которые могут ещё не предоставлять его нативно (например, IE 11), рассмотрите возможность включения полифилла `Function.name` в бандл вашего приложения, например [`function.name-polyfill`](https://github.com/JamesMGreene/Function.name). В качестве альтернативы, вы можете явным образом задать проп [`displayName`](/docs/react-component.html#displayname) в каждом из ваших компонентов.
106
104
107
105
## А как насчёт try/catch? {#how-about-trycatch}
108
106
109
-
`try` / `catch`- отличная конструкция, но она работает исключительно в императивном коде:
107
+
`try` / `catch`— отличная конструкция, но она работает исключительно в императивном коде:
110
108
111
109
```js
112
110
try {
@@ -159,7 +157,7 @@ class MyComponent extends React.Component {
159
157
160
158
Обратите внимание, что приведённый выше пример демонстрирует стандартное поведение JavaScript и не использует предохранителей.
161
159
162
-
## Изменения в названиях по сравнению с React 15 {#naming-changes-from-react-15}
160
+
## Изменение названия метода по сравнению с React 15 {#naming-changes-from-react-15}
163
161
164
162
React 15 включал очень ограниченную поддержку предохранителей с другим названием метода: `unstable_handleError`. Этот метод больше не работает и вам будет нужно заменить его в вашем коде на `componentDidCatch` начиная с первого бета-релиза React 16.
0 commit comments