تسلط بر مرزهای خطا در React: راهنمای مدیریت موثر خطا

مرز خطا چیست؟
در هنگام ساخت برنامه ها، خطاها اجتناب ناپذیر هستند. آنها ممکن است از API ها، UI یا از چندین مکان دیگر آمده باشند.
بسیار مهم است که با این خطاها با ظرافت برخورد کنید و با وجود این خطاها UX خوب را حفظ کنید.
Error Boundary یکی از این روشهای مدیریت خطا در React است.
مرز خطا چگونه کمک می کند؟
برای درک این موضوع، بیایید وضعیت قبل از معرفی مرز خطا را درک کنیم.
قبل از Error Boundaries، خطاهایی که در داخل مؤلفهها رخ میدهند در نهایت منتشر شده و رابط کاربری را شکسته یا صفحه سفید را نشان میدهند.
این باعث یک UX واقعا بد شد.
مرز خطا به ما کمک می کند تا با چنین خطاهایی برخورد کنیم و به جای شکستن رابط کاربری یا صفحه سفید نمایش داده شده، یک رابط کاربری بازگشتی نمایش دهیم.
چگونه از مرز خطا استفاده کنیم؟
React v16 به طور رسمی Error Boundary را معرفی کرد.
این یک جزء مبتنی بر کلاس است که می تواند برای بسته بندی برنامه شما استفاده شود.
این یک رابط کاربری بازگشتی را میپذیرد تا در صورتی که برنامه شما دارای خطا باشد یا در غیر این صورت نمایش داده شود، به سادگی مؤلفه فرزند را برای از سرگیری جریان عادی برنامه شما ارائه میکند.
به این صورت است که React Documentation استفاده از آن را توصیه می کند،
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;
}
}
مشکل مرز خطای React چیست؟
نمی تواند خطاهای رخ داده در،
- رویداد Handlers (این خطاها باید با بلوکهای try-catch کنترل شوند)
- کد ناهمزمان (API ها، setTimeout، requestAnimationFrame و غیره)
- رندر سمت سرور
- خطایی که در خود Error Boundary رخ می دهد
- با کامپوننت های کاربردی کار نمی کند. اگرچه میتوانیم آن را با چند تغییر کد کار کنیم.
- داخل آن نمی توان از قلاب استفاده کرد.
راه حل چیست؟
یک بسته npm به نام react-error-boundary وجود دارد که در بالای مولفه سنتی Error Boundary قرار دارد.
با استفاده از این بسته، میتوانیم بر تمام مشکلات موجود در مؤلفه مرز خطای سنتی غلبه کنیم.
چگونه از آن استفاده کنیم؟
شما می توانید کل برنامه خود را با یا می توانید اجزای جداگانه را با .
جزئیات اجرا به عهده شماست.
بیایید نحوه استفاده از آن را درک کنیم.
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>
}
این ساده ترین مثال استفاده از ErrorBoundary است. چیزهای بیشتری در این کتابخانه وجود دارد.
درک واکنش خطا-مرز API
بیایید سعی کنیم API را با سناریوهای مختلف درک کنیم.
1. من می خواهم یک رابط کاربری عمومی برای خطاها در برنامه نشان دهم
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>
}
2. من می خواهم جزئیات خطای خاصی را در جزء بازگشتی خود نشان دهم
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}/pre>
/div>
);
}
const App = () => {
return ErrorBoundary
fallbackRender={fallbackRender}
onReset={(details) => {
// Reset the state of your app so the error doesn't happen again
}}
>
/* rest of your component */
/ErrorBoundary>
}
به جای بازگشت مجدد یا رندر، می توانید از React Component نیز استفاده کنید.
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}/pre>
/div>
);
}
const App = () => {
return ErrorBoundary
FallbackComponent={Fallback}
onReset={(details) => {
// Reset the state of your app so the error doesn't happen again
}}
>
/* rest of your component */
/ErrorBoundary>
}
3. من می خواهم خطاهای خود را ثبت کنم
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}/pre>
/div>
);
}
// You can use fallback / fallbackRender / FallbackComponent anything
const App = () => {
return ErrorBoundary
FallbackComponent={Fallback}
onError={logError}
onReset={(details) => {
// Reset the state of your app so the error doesn't happen again
}}
>
/* rest of your component */
/ErrorBoundary>
}
4. میخواهم خطاها را در کنترلکنندههای رویداد و کدهای همگامسازی پیدا کنم
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/>
}
چند تا گوچا
ErrorBoundary یک جزء مشتری است. شما فقط می توانید پروپوزال هایی را به آن ارسال کنید که قابل سریال سازی هستند یا از آن در فایل هایی استفاده کنید که دارای “use Client” هستند. بخشنامه
1. سرپایی قابل سریال چیست؟
Prop Serilzable به این معنی است که می توان آن را به جریان بایتی تبدیل کرد به گونه ای که جریان بایت را می توان به پایه اصلی تبدیل کرد.
یک راه معمول برای انجام این کار در جاوا اسکریپت JSON.stringify() و JSON.parse() است.
2. نحوه استفاده از “استفاده از مشتری”; بخشنامه؟
به سادگی آن را در بالای فایل ذکر کنید
"use client";
چند تغییر دیگر وجود دارد که می توانید استفاده کنید. اما این مقاله به اندازه کافی خوب است تا شما را شروع کنید.
اسناد کامل آنها را اینجا بررسی کنید.
لطفا اگر مفید بود در نظرات به من اطلاع دهید.
کد نویسی مبارک!