Menguasai Sempadan Ralat dalam Reaksi: Panduan untuk Pengendalian Ralat yang Berkesan

WBOY
Lepaskan: 2024-07-20 00:55:30
asal
706 orang telah melayarinya

Mastering Error Boundaries in React: A Guide to Effective Error Handling

Apakah Sempadan Ralat?

Semasa membina aplikasi, ralat tidak dapat dielakkan. Ia mungkin datang daripada API, UI atau dari beberapa tempat lain.

Sangat penting untuk mengendalikan ralat ini dengan anggun & mengekalkan UX yang baik walaupun terdapat ralat ini.

Sempadan Ralat ialah salah satu cara pengendalian ralat dalam React.


Bagaimanakah Ralat Sempadan membantu?

Untuk memahami perkara ini, mari kita fahami situasi sebelum pengenalan Sempadan Ralat.

Sebelum Had Ralat, ralat yang berlaku di dalam komponen akhirnya merebak & memecahkan UI atau memaparkan skrin putih.

Ini menyebabkan UX yang sangat teruk.

Sempadan Ralat membantu kami mengendalikan ralat tersebut & memaparkan UI sandaran dan bukannya memecahkan UI atau skrin putih yang dipaparkan.


Bagaimana untuk menggunakan Error Boundary?

React v16 secara rasmi memperkenalkan Sempadan Ralat.

Ia adalah Komponen Berasaskan Kelas yang boleh digunakan untuk membalut aplikasi anda.

Ia menerima UI sandaran untuk dipaparkan sekiranya aplikasi anda mempunyai ralat atau sebaliknya, ia hanya menjadikan komponen kanak-kanak untuk menyambung semula aliran biasa aplikasi anda.

Beginilah cara Dokumentasi React mengesyorkan menggunakannya,

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Example "componentStack":
    //   in ComponentThatThrows (created by App)
    //   in ErrorBoundary (created by App)
    //   in div (created by App)
    //   in App
    logErrorToMyService(error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return this.props.fallback;
    }

    return this.props.children;
  }
}

Salin selepas log masuk

Apakah masalah dengan Sempadan Ralat React?

Ia tidak dapat menangkap ralat yang berlaku dalam,

  • Pengendali Acara (ralat ini perlu dikendalikan dengan blok cuba-tangkap)
  • Kod Asynchronous (API, setTimeout, requestAnimationFrame dll.)
  • Pemaparan sebelah pelayan
  • Ralat yang berlaku dalam Error Boundary itu sendiri
  • Ia tidak berfungsi dengan Komponen Fungsian. Walaupun kita boleh menjadikannya berfungsi dengan beberapa perubahan kod.
  • Cangkuk tidak boleh digunakan di dalamnya.

Apakah penyelesaiannya?

Terdapat pakej npm yang dipanggil react-error-boundary yang merupakan pembalut di atas komponen Error Boundary tradisional.

Menggunakan pakej ini, kami dapat mengatasi semua isu yang dihadapi dalam komponen Sempadan Ralat tradisional.


Bagaimana cara menggunakannya?

Anda boleh membalut keseluruhan aplikasi anda atau anda boleh membalut komponen individu dengan .

Perincian pelaksanaan terpulang kepada anda.

Mari kita fahami cara menggunakannya.

import React from 'react';
import { ErrorBoundary } from "react-error-boundary";

const App = () => {
return <ErrorBoundary fallback={<div>Something went wrong</div>}>
/* rest of your component */
</ErrorBoundary>
}

Salin selepas log masuk

Ini adalah contoh paling mudah menggunakan ErrorBoundary. Terdapat banyak lagi perpustakaan ini.


Memahami API react-error-boundary

Mari cuba memahami API dengan senario yang berbeza.

1. Saya ingin menunjukkan UI sandaran generik untuk Ralat dalam Aplikasi

 import React from 'react';
 import { ErrorBoundary } from "react-error-boundary";

 const App = () => {
 return <ErrorBoundary fallback={<div>Something went wrong</div>}>
 /* rest of your component */
 </ErrorBoundary>
 }
Salin selepas log masuk

2. Saya ingin menunjukkan butiran ralat khusus dalam komponen sandaran saya

 import React from 'react';
 import { ErrorBoundary } from "react-error-boundary";

 function fallbackRender({ error, resetErrorBoundary }) {
   // Call resetErrorBoundary() to reset the error boundary and retry the render.
   return (
     <div role="alert">
       <p>Something went wrong:</p>
       <pre style={{ color: "red" }}>{error.message}
); } const App = () => { return { // Reset the state of your app so the error doesn't happen again }} > /* rest of your component */ }
Salin selepas log masuk

Daripada membuat sandaran atau sandaranRender, anda juga boleh menggunakan Komponen Reaksi.

 import React from 'react';
 import { ErrorBoundary } from "react-error-boundary";

 const Fallback = ({ error, resetErrorBoundary }) => {
   // Call resetErrorBoundary() to reset the error boundary and retry the render.
   return (
     <div role="alert">
       <p>Something went wrong:</p>
       <pre style={{ color: "red" }}>{error.message}
); } const App = () => { return { // Reset the state of your app so the error doesn't happen again }} > /* rest of your component */ }
Salin selepas log masuk

3. Saya mahu Log kesilapan saya

 import React from 'react';
 import { ErrorBoundary } from "react-error-boundary";

 const logError = (error: Error, info: { componentStack: string }) => {
   // Do something with the error, e.g. log to an external API
 };

 const Fallback = ({ error, resetErrorBoundary }) => {
   // Call resetErrorBoundary() to reset the error boundary and retry the render.
   return (
     <div role="alert">
       <p>Something went wrong:</p>
       <pre style={{ color: "red" }}>{error.message}
); } // You can use fallback / fallbackRender / FallbackComponent anything const App = () => { return { // Reset the state of your app so the error doesn't happen again }} > /* rest of your component */ }
Salin selepas log masuk

4. Saya ingin menangkap ralat dalam pengendali acara & kod async

 import { useErrorBoundary } from "react-error-boundary";

 function Example() {
   const { showBoundary } = useErrorBoundary();
   const getGreeting = async(name) => {
     try {
         const response = await fetchGreeting(name);
         // rest of your code
     } catch(error){
          // Show error boundary
         showBoundary(error);
     }
   }
   useEffect(() => {
    getGreeting()
   });

   return <Whatever UI you want to render/>
 }

Salin selepas log masuk

Beberapa gotchas

ErrorBoundary ialah komponen pelanggan. Anda hanya boleh menghantar props yang boleh bersiri atau menggunakannya dalam fail yang mempunyai "pengguna klien"; arahan.

1. Apakah prop boleh bersiri?

Prop Serilzable bermakna ia boleh ditukar kepada strim bait dengan cara yang strim bait boleh ditukar kembali kepada prop asal.

Cara biasa untuk melakukannya dalam Javascript ialah JSON.stringify() & JSON.parse().

2. Cara menggunakan "use client"; arahan?

Sebut sahaja di bahagian atas fail

"use client";

Salin selepas log masuk

Ada beberapa lagi variasi yang anda boleh gunakan. Tetapi artikel ini cukup bagus untuk membantu anda bermula.

Lihat dokumentasi penuh mereka di sini.

Sila beritahu saya dalam ulasan jika anda rasa ia membantu.

Selamat Pengekodan!

Atas ialah kandungan terperinci Menguasai Sempadan Ralat dalam Reaksi: Panduan untuk Pengendalian Ralat yang Berkesan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Artikel sebelumnya:Flutter lwn React Native Artikel seterusnya:Meningkatkan Prestasi Laman Web dengan Pemerhati Persimpangan
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Isu terkini
Topik-topik yang berkaitan
Lagi>
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan