כניסה
ראשי
אודות
קורסים
מאמרים
מאמרים בנושא בלוקצ'ייןמאמרים בנושא פיתוח
דברו איתנו!
FacebookGitHubLinkedin
logologo
  • ראשי
  • אודות
  • קורסים
  • מאמרים
  • מאמרים בנושא בלוקצ'יין

    מאמרים מקיפים על טכנולוגיית בלוקצ'יין, חוזים חכמים ופיתוח Web3

    מאמרים בנושא פיתוח

    טיפים, טכניקות וכלים מתקדמים לפיתוח אפליקציות ווב מודרניות

  • דברו איתנו!
logologo

תקנות ופרטיות

תקנון ותנאי שימושהצהרת נגישות

רשתות חברתיות

FacebookGitHubLinkedin
author

אייל יחיא,

מפתח תוכנה

FacebookGitHubLinkedin
Clipboard

איך להשתמש ב- Suspense בריאקט

image

איך עובד Suspense

אז כדי שנבין יותר טוב איך זה עובד צריך להבין איך ריאקט מאחורי הקלעים מרנדרת את הקומפוננטות, ריאקט מרנדרת עץ קומפוננטות שדרכו מיוצר לנו אוביקט של הDOM ,הBrowser מציג לנו את הדף ע"י עיבוד האובייקט.
אבל מה קורה ברגע שאחת הקומפוננטות צריכה להתעדכן כתוצאה מקוד אסינכרוני שעתיד להציג את המידע בקומפוננטה.
אז כאן Suspense נכנס לפעולה ומאפשר לנו לעצור את הרינדור של הקומפוננטה ולהציג לנו מידע חלופי עד שהקוד האסינכרוני יסתיים ובסופו להציג לנו את הקומפוננטה לאחר סיום התהליך.

אופן השימוש

Suspense מתנהג כHOC ועוטף את הקומפוננטה המכילה את הקוד האסינכרוני,
Suspense מקבל props בשם fallback שמכיל קומפוננטה או קטע קוד שירוץ בזמן שאנו מחכים שהפעולה האסינכרונית תסתיים.

App.jsx
<Suspense fallback={<Loading />}>
  <fetchComponent />
</Suspense>

מטרת השימוש

שמדברים על ניהול loading states בריאקט זה יכול להיות עבודה מורכבת ונוטה לגרום לשגיאות,
suspense נוצר כדי לספק חווית משתמש בטעינה דאטה אסינכרונית,
ולספק חווית פיתוח בניהול loading states של דאטה אסינכרונית.

פיצ'רים

React.lazy

lazy - מאפשר לנו לחלק את הקוד באפליקציה לנתחים קטנים (code-spliting)
ולטעון רק את החלקים שאנו עושים בהם שימוש בעת השימוש באפליקציה,
היכולת הזאת מקטינה לנו את כמות הקבצים שאנו זקוקים לטעון בטעינה הראשונית של האפליקציה (bundle), ומספק לנו שיפור ביצועים וחווית משתמש, מתי שאנו נבקש לעבור לדף אחר הוא יטען אותו ויציג לנו אותו.

כלומר אם יש לי דף של About באפליקציה שלי ובטעינה הראשונית אני לא עושה בו שימוש lazy יעזור לי לחסוך את הקוד הזה באתחול האפליקציה ורק לאחר שהמשתמש יבקש את הדף הוא יתרגם אותו ויציג למשתמש.
היכולת הזאת יצאה בגרסה 16.6 של ריאקט ביחד עם Suspense ומשתמשת בו כConvention לניהול הloading states בזמן הרצת הקוד של הדף המבוקש.

App.jsx
import { Suspense } from 'react';
const fetchComponent = lazy(() => import('./fetchComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<Loading />}>
        <fetchComponent />
      </Suspense>
    </div>
  );
}

Error Boundaries

גבולות שגיאה - למדנו שהשימוש של Suspense זה בהמתנה לקוד האסינכרוני שיסתיים
אבל מה קורה שחוזרת שגיאה מהקוד האסינכרוני שהBrowser צריך לעבד?
הUI שלנו ישבר ונקבל דף לבן, כדי להימנע מזה יש לנו את Error Boundaries שתפקידו לשמש כגבול לפני שבירת הUI ויחזיר שגיאה שמאופיינת על ידינו אל המשתמש.

אז איך משתמשים בזה

השימוש של זה בדומה לSuspense כHOC שעוטף את הקומפוננטה שמכילה את הקוד האסינכרוני,
Error Boundaries מקבל props בשם fallback או FallbackComponent שמכילה את מבנה השגיאה שנרצה להחזיר למשתמש,
בדוגמא שלנו נשתמש בספרייה של react-error-boundary.

App.jsx
import { ErrorBoundary } from 'react-error-boundary'
import { Suspense } from 'react'


function App() {
  return(
        <div>
      <h1>Leo's App</h1>
      <ErrorBoundary fallback={<p>something get wrong</p>}>
        <Suspense fallback={<Loading />}>
          <DataFetchingComponent />
        </Suspense>
      </ErrorBoundary>
    </div>
  )
}
export default App

אפשר גם להכניס כמה פיצ'רים בניהול השגיאה, onReset = props שמקבל פונקציה שתופעל בעת לחיצת על כפתור ותרנדר לנו מחדש את הקומפוננטה.

App.jsx
 onReset={(details) => {
    // Reset the state of your app so the error doesn't happen again
  }}

FallbackComponent - שמרנדר קומפוננטה כfallback במקרה שיש שגיאה

App.jsx
  FallbackComponent={Fallback}

לבסוף Suspense יצא כחלק מסדרה של concurrent mode זה סדרה של קומפוננטה שבאו ליעל חלק מהחסרונות ברינדור קומפוננטות בצורה אסינכרונית ולשפר ביצועים בריאקט,
Next.js - עושה שימוש בפיצ'רים האלו built in Suspense - בתצורת קומפוננטה של loading, Error-Boundary - בתצורת קומפוננטה של Error, וCode-spliting built in.