
На самом деле изменение в обработке ошибок весьма существенно, потому что теперь оно вызовет процесс размонтирования дерева компонентов, если там ошибка не была обработана. Так что будьте очень осторожны при переносе кода на новейшую версию - вы можете столкнуться с некоторыми сюрпризами с ошибками :) Мы все пишем тесты (не так ли?), Думаем, что наше приложение не содержит ошибок, но иногда они просто появляются. Именно так это чаще всего работает в процессе разработки программного обеспечения.
Итак, что означает, что компонент, в котором ошибка не была обработана должным образом, будет размонтирован? Он просто не будет отображаться в представлении. Команда React решила решить эту проблему только так, а не иначе. В их блоге есть пояснения, поэтому выделим главное сообщение:
Мы обсуждали это решение, но, по нашему опыту, хуже оставить поврежденный пользовательский интерфейс на месте, чем полностью удалить его. Например, в таком продукте, как Messenger, оставление поврежденного пользовательского интерфейса видимым может привести к тому, что кто-то отправит сообщение не тому человеку. Точно так же для платежного приложения хуже отображать неправильную сумму, чем ничего не отображать.
Что нам нужно, чтобы корректно обрабатывать ошибки в React 16? Всего две вещи:
1. Компонент класса, который будет служить границей ошибок
2. Специальный метод - componentDidCatch () - внутри класса.
Затем нам просто нужно обернуть его вокруг некоторого подверженного ошибкам компонента. Звучит отлично? Давайте посмотрим на пример реализации:
Компонент Граница ошибок:
class YouCanRunButCantHide extends React.Component {
constructor(props) {
super(props);
this.state = {
errorFound: false
};
}
componentDidCatch(error, info) {
this.setState({
errorFound: true
});
console.log('error: ', error);
console.log('info: ', info);
}
render() {
if (this.state.errorFound) {
return <p>Error caught!</p>;
}
return this.props.children;
}
}
Состояние errorFound изначально имеет значение false и изменяется на true в методе componentDidCatch (). Предоставляется доступ к самой ошибке и некоторой информации о ней внутри метода. В случае ошибок в компоненте будет отображаться текст «Ошибка обнаружена!».
Компонент с ошибкой:
const ErrorSmuggler = ({ errorGuy: { name, age, profession } }) => {
return (
<div className="error-smuggler">
{`This is ${name}, age ${age} and his profession is ${profesion}`}
</div>
)
};
ErrorSmuggler.propTypes = {
errorGuy: PropTypes.shape({
name: PropTypes.string,
age: PropTypes.number,
profession: PropTypes.string
})
};
ErrorSmuggler.defaultProps = {
errorGuy: {
name: 'Joe',
age: 25,
profession: "error smuggler"
}
};
Здесь я использовал фиктивный (не имеющий состояния / функциональный) компонент и намеренно неправильно написал опору профессии (вы можете заметить разницу?). Сделана ошибка, поэтому ее можно корректно обработать с помощью YouCanRunButCantHide Error Boundary
, созданного нами ранее. Деструктуризация и Типы свойств используются как хорошие методы, которым я рекомендую вам следовать.
Обертка:
const ErrorSmugglerWrapper = () => ( <YouCanRunButCantHide> <ErrorSmuggler /> </YouCanRunButCantHide> ); export default ErrorSmugglerWrapper;
Здесь особо нечего сказать. Мы просто оборачиваем наш испорченный компонент компонентом Error Boundary.
Есть некоторые проблемы CORS с ошибками, с которыми сталкиваются люди. Вы можете получить некоторую помощь, прочитав эту статью.