captureOwnerStack¶
captureOwnerStack читает текущий стек владельца в режиме разработки и возвращает его строкой, если он доступен.
1 | |
Описание¶
captureOwnerStack()¶
Вызовите captureOwnerStack, чтобы получить текущий стек владельца.
1 2 3 4 5 6 7 8 | |
Параметры¶
captureOwnerStack не принимает никаких параметров.
Возвращаемое значение¶
captureOwnerStack возвращает string | null.
Стеки владельца доступны в
- рендере компонента
- эффектах (например,
useEffect) - обработчиках событий React (например,
<button onClick={...} />) - обработчиках ошибок React (параметры корня React
onCaughtError,onRecoverableErrorиonUncaughtError)
Если стек владельца недоступен, возвращается null (см. Устранение неполадок: стек владельца равен null).
Предупреждения¶
- Стеки владельца доступны только в режиме разработки. Вне режима разработки
captureOwnerStackвсегда возвращаетnull.
Стек владельца и стек компонента
Стек владельца отличается от стека компонента, доступного в обработчиках ошибок React, например errorInfo.componentStack в onUncaughtError.
Например, рассмотрим следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
SubComponent выбросит ошибку. Стек компонента этой ошибки будет
1 2 3 4 5 6 | |
Однако стек владельца прочитает только
1 | |
Ни App, ни DOM-компоненты (например, fieldset) не считаются владельцами в этом стеке, поскольку они не участвовали в «создании» узла, содержащего SubComponent. App и DOM-компоненты только пробросили узел дальше. App просто отрендерил узел children, в отличие от Component, который создал узел, содержащий SubComponent, через <SubComponent />.
Ни Navigation, ни legend вообще нет в стеке, поскольку они лишь соседи узла, содержащего <SubComponent />.
SubComponent опущен, потому что он уже является частью стека вызовов.
Использование¶
Улучшение собственного оверлея ошибок¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Если вы перехватываете вызовы console.error, чтобы подсвечивать их в оверлее ошибок, вы можете вызвать captureOwnerStack, чтобы включить стек владельца.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 | |
Устранение неполадок¶
Стек владельца равен null¶
Вызов captureOwnerStack произошёл вне функции, контролируемой React, например в колбэке setTimeout, после вызова fetch или в собственном обработчике DOM-события. Во время рендеринга, в эффектах, обработчиках событий React и обработчиках ошибок React (например, hydrateRoot#options.onCaughtError) стеки владельца должны быть доступны.
В примере ниже нажатие на кнопку запишет в лог пустой стек владельца, потому что captureOwnerStack был вызван в собственном обработчике DOM-события. Стек владельца нужно захватить раньше, например перенеся вызов captureOwnerStack в тело эффекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
captureOwnerStack недоступен¶
captureOwnerStack экспортируется только в сборках для разработки. В продакшен-сборках он будет undefined. Если captureOwnerStack используется в файлах, которые собираются и для продакшена, и для разработки, обращайтесь к нему условно из импорта пространства имён.
1 2 3 4 5 6 7 8 9 | |
Источник — https://react.dev/reference/react/captureOwnerStack