React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなかった部分です。実はとても便利な部分です。まとめてみましょう〜 React でキャッチされない JS エラーが発生すると、アプリケーション全体がクラッシュし、コンポーネント ツリー全体がアンマウントされる可能性があります。これは React 16 以降に当てはまります。しかし同時に、React はエラー境界という新しい概念も導入しました。 定義、それはエラー境界は、子コンポーネント ツリー内の任意の場所で JavaScript エラーをキャッチ (印刷など) して処理し、必要に応じて代替 UI をレンダリングできるコンポーネントです。 try-catch と同様に動作しますが、エラー境界は React コンポーネントにのみ使用されます。 クラス コンポーネントのみがエラー境界コンポーネントになることができます。エラー境界は、サブコンポーネント内のエラーのみをキャプチャでき、それ自体のエラーはキャプチャできません。 エラー境界は、レンダリング中、ライフサイクル中、およびコンポーネント ツリー全体のコンストラクター内でエラーをキャッチします。エラー境界処理がなければ、レンダリングされた子コンポーネント ツリーは依然として折りたたまれますが、これは明らかに望ましいことではありません。 エラー境界を段階的に使用する方法を示す例を見てみましょう。 デフォルトクラス ErrorTest をエクスポートし、Component を拡張します { コンストラクタ(props) { スーパー(小道具); } 与える() { 戻る ( <div> <バグカウンタ></バグカウンタ> <span>私の名前はダンです</span> </div> ); } } // バグエラーコンポーネントクラス BugCounter は Component を拡張します { コンストラクタ(props) { スーパー(小道具); この状態 = { カウンター: 0, }; } クリック = () => { this.setState(({ counter }) => ({ counter: counter + 1 })); }; 与える() { if (this.state.counter === 5) { 新しいエラーをスローします("クラッシュしました!"); } 戻る ( <div> <h3 onClick={this.click}>{this.state.counter}</h3> </div> ); } } 上記コードのレンダリング結果(スタイルは無視): 数字の この 本番モードでは、白い画面が表示され、コンソールにエラーが報告されます。 getDerivedStateFromError と componentDidCatch この種のクラッシュを処理するにはエラー境界が必要です。エラー境界を定義するにはどうすればよいでしょうか? コンポーネントを定義し、 これら 2 つのライフサイクル機能については、次のように要約されているリンクから確認できます。 コンポーネントDidCatch(エラー、情報) 静的 getDerivedStateFromError(エラー) 子コンポーネントがエラーをスローした後に、スローされたエラーを引数として呼び出されます。状態を更新するには値を返す必要があります。この関数はレンダリング フェーズ中に呼び出され、副作用は許可されません。エラーをキャッチした後に副作用を実行する必要がある場合は、 エラー境界コンポーネントの作成組み合わせメソッドを使用して、エラー境界コンポーネントを追加し、使用するコンポーネントをラップすることができます。このコンポーネントには次の効果が必要です:
すると次のようになります: ErrorBoundaryクラスはReact.Componentを拡張します。 コンストラクタ(props) { スーパー(小道具); this.state = {hasError: false }; } 静的 getDerivedStateFromError(エラー) { // 次のレンダリングで劣化した UI を表示できるように状態を更新します {hasError: true } を返します。 } コンポーネントDidCatch(エラー、エラー情報) { // エラー ログをサーバーに報告することもできます logErrorToMyService(error, errorInfo); } 与える() { if (this.state.hasError) { // ダウングレードされた UI をカスタマイズしてレンダリングできます。 return <h1>Something went wrong.</h1>; } this.props.children を返します。 } } エラーをキャッチした後の副作用は、カスタマイズされ、サーバーにアップロードされるか、 コンポーネントDidCatch(エラー、エラー情報) { // 以下のコンポーネントでエラーをキャッチし、エラーメッセージとともに再レンダリングします this.setState({ エラー: エラー、 エラー情報: エラー情報 }) } キャプチャ処理すべてのコードを追加し、問題のあるコンポーネントをエラー境界コンポーネントでラップして、結果を確認します。 「react」からコンポーネントをインポートします。 デフォルトクラス ErrorTest をエクスポートし、Component を拡張します { 与える() { 戻る ( <div> <エラー境界> <バグカウンタ></バグカウンタ> </エラー境界> <span>私の名前はダンです</span> </div> ); } } // バグエラーコンポーネントクラス BugCounter は Component を拡張します { コンストラクタ(props) { スーパー(小道具); この状態 = { カウンター: 0, }; } クリック = () => { this.setState(({ counter }) => ({ counter: counter + 1 })); }; 与える() { if (this.state.counter === 5) { 新しいエラーをスローします("クラッシュしました!"); } 戻る ( <div> <h3 onClick={this.click}>{this.state.counter}</h3> </div> ); } } // エラー境界処理コンポーネントクラス ErrorBoundary は Component を拡張します { コンストラクタ(props) { スーパー(小道具); this.state = {hasError: false }; } 静的 getDerivedStateFromError(エラー) { // 次のレンダリングで劣化した UI を表示できるように状態を更新します {hasError: true } を返します。 } 与える() { if (this.state.hasError) { // ダウングレードされた UI をカスタマイズしてレンダリングできます。 return <h1>Something went wrong.</h1>; } this.props.children を返します。 } } 例外をスローすると開発モードではまだエラーが報告されますが、 範囲エラー境界は、サブコンポーネントのライフ サイクルとレンダリング関数のエラーを処理するために使用されます。イベント ハンドラーの場合、レンダリング中にはトリガーされません。イベント ハンドラーによってスローされる例外には、 エラー境界では、次のシナリオではエラーをキャッチできません。
エラー境界に関しては、 https://codepen.io/gaearon/pen/wqvxGa?editors=0010 参照:https://zh-hans.reactjs.org/docs/error-boundaries.html https://zh-hans.reactjs.org/docs/react-component.html https://codepen.io/gaearon/pen/wqvxGa?editors=0010 React error boundary コンポーネントの取り扱いに関する記事はこれで終了です。React error boundary に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Linux シェル環境での Zabbix API の使用
>>: MySQLクエリの文字セットの不一致の問題を解決する方法
デフォルトの Linux カーネル パラメータは最も一般的なシナリオに基づいており、高い同時アクセス...
目次1. 計算プロパティ構文: 1. 省略形:文法: 2. 文章を完成させる: 2. モニタリング(...
この記事では、MySQL の整合性制約について説明します。ご参考までに、詳細は以下の通りです。メイン...
プロジェクトがある程度複雑になると、必然的にロジックの再利用の問題に直面することになります。 Rea...
基本的な構文text-overflow を使用するには、hight、over-flow:hidden...
1. Python 3をインストールする1. 依存パッケージをインストールしますyum instal...
react-routerでは、コンポーネント内のジャンプは<Link>で使用できます。し...
今日、問題が発生しました。ブラウザのアドレスバーにURLアドレスを入力する際、ページを正常にアクセス...
1. インストール前の準備: 1.1 JDKをインストールするopenjdkをアンインストールする...
目次概要インデックスデータ構造バイナリツリー赤黒木BツリーB+ツリーハッシュ索引InnoDB インデ...
コードをコピーコードは次のとおりです。 jQuery.cookie = 関数(名前、値、オプション)...
Web ページのデザインに関する質問です。すべてに答えられるでしょうか? 1. 単一選択の質問 (...
序文この記事は主に CentOS7 で PHP スケジュールタスクを実行することに関する関連コンテン...
最近、Vue プロジェクトについて知り、ElementUI でデータを xlsx および Excel...
MySQLデーモンの起動に失敗したエラーの解決方法数日前、公開されたウェブサイトはこれらのアクティビ...