React היא ספריית JavaScript לבניית ממשקי משתמש מקומפוננטות. אתם מתארים איך המסך צריך להיראות עבור הנתונים הנוכחיים, וכשהנתונים משתנים, React מעדכנת את הדף בהתאם. React, React JS ו-ReactJS הם אותו דבר: ספריית קוד פתוח שנוצרה בפייסבוק (היום Meta).
לחצו על שני הכפתורים. כל Counter שומר מספר משלו, כי כל אחד הוא עותק נפרד של הקומפוננטה עם state משלו. הוסיפו שורה שלישית, <Counter label="Plums" />, ויופיע מונה חדש ועצמאי.
הדוגמה הקצרה הזו כבר מראה את שלושת הרעיונות ש-React בנויה עליהם: קומפוננטות (Counter ו-App הן פונקציות שמחזירות UI), JSX (התחביר שדומה ל-HTML בתוך return), ו-state (count, ערך שגורם ל-React לצייר מחדש את הקומפוננטה כשהוא משתנה).
הבעיה ש-React פותרת
ממשק משתמש הוא תמונה של נתונים. כשהנתונים משתנים, גם התמונה צריכה להשתנות, וכל חלק במסך שתלוי בנתונים האלה צריך להשתנות יחד איתם. בלי ספרייה, כותבים את הקוד הזה ידנית: מוצאים כל אלמנט, ואז קובעים בעצמכם את הטקסט, ה-class או הנראות שלו. כל פיצ'ר חדש מוסיף עוד מקום שצריך לזכור לעדכן.
React הופכת את זה. אתם כותבים פונקציה אחת שאומרת מה המסך צריך להיות עבור state נתון, ו-React מחשבת אילו חלקים בדף צריכים להשתנות. זה נקרא UI דקלרטיבי, בניגוד לקוד אימפרטיבי שמפרט כל שינוי ב-DOM צעד אחר צעד. הנה שני הסגנונות זה לצד זה בדוגמה אחת:
ByHand מוסר את הפסקה שלו לקוד DOM רגיל (האפקט מריץ את הקוד הזה רק אחרי ש-React יצרה את הפסקה). הוא שומר את המספר במשתנה, מוצא כל אלמנט עם querySelector וקובע את הטקסט שלו ידנית. Declarative רק אומר "הצג את הספירה, והצג אם היא זוגית". מחקו את השורה ב-handleClick שקובעת את .parity ולחצו כמה פעמים: השורה הראשונה טוענת עכשיו ש-3 זוגי, ואילו השורה השנייה לא יכולה לצאת מסנכרון, כי הטקסט מחושב מ-count בכל רינדור.
איך React מעדכנת את הדף
כש-state משתנה, React קוראת שוב לפונקציית הקומפוננטה שלכם. הקריאה הזו היא רינדור. הפונקציה מחזירה תיאור חדש של ה-UI, React משווה אותו לקודם, ואז משנה רק את החלקים בדף האמיתי שבהם יש הבדל. את התיאור הזה שבזיכרון קוראים לעיתים קרובות virtual DOM.
פתחו את הקונסול מתחת לתצוגה המקדימה והקלידו כמה אותיות. כל הקשה רושמת רינדור אחד עם הערך החדש. שדה הקלט שומר על הפוקוס ועל מיקום הסמן, כי React נגעה רק בטקסט של הפסקה ובערך של השדה, לא בכל הדף. הדף על רינדור מסביר בדיוק מתי קומפוננטה מתרנדרת מחדש.
קומפוננטות, JSX ו-state במבט מהיר
קומפוננטות הן פונקציות JavaScript ששמן מתחיל באות גדולה. הן מחזירות את מה שצריך להופיע על המסך, ומשתמשים בהן כמו בתגיות HTML: <Counter />. דף הוא עץ של קומפוננטות, מקטנות כמו כפתור ועד גדולות כמו מסך הגדרות שלם. ראו קומפוננטות.
JSX הוא התחביר שמאפשר לכתוב markup בתוך JavaScript. סוגריים מסולסלים מחזירים אתכם ל-JavaScript, כך ש-{count} מציג ערך ו-{items.map(...)} הופך מערך לרשימה. כלי build מקמפל את ה-JSX לקריאות פונקציה רגילות לפני שהדפדפן מריץ אותו.
State הוא מידע שקומפוננטה זוכרת בין רינדורים. יוצרים אותו עם ההוק useState, וקריאה ל-setter שלו היא הדרך לומר ל-React שמשהו השתנה. נתונים זורמים מטה מהורים לילדים דרך props, שהם הארגומנטים של קומפוננטה.
הדוגמה הזו משתמשת בכולם: רשימה שמרונדרת ממערך ב-state, וטופס שמוסיף אליה.
הוסיפו משימה ושני דברים משתנים בבת אחת: הרשימה והספירה שמתחתיה. אף פעם לא אמרתם לספירה להתעדכן. שתיהן קוראות מ-tasks, ולכן שתיהן עוקבות אחריו. שנו את המערך ההתחלתי ל-[] והרשימה תציג במקום זאת "Nothing to do.".
מה React היא לא
React היא ספרייה, לא framework מלא. היא מכסה קומפוננטות, state והפיכתם ל-UI, ובכוונה משאירה בחוץ כמה דברים שאפליקציה שלמה צריכה:
- ניתוב (Routing). אין דרך מובנית למפות כתובות URL לדפים. React Router והראוטרים של ה-frameworks ממלאים את החסר.
- טעינת נתונים ורינדור בצד השרת. React נותנת כלים כמו אפקטים ו-Suspense, אבל אין לה דעה מאיפה מגיעים הנתונים או איך דפים מתרנדרים בשרת.
- הגדרת build. דפדפנים לא מבינים JSX, ולכן צריך כלי כמו Vite כדי לקמפל אותו.
Frameworks נבנים מעל React כדי לספק את החלקים האלה. Next.js ו-מצב ה-framework של React Router מוסיפים ניתוב, רינדור בצד השרת וטעינת נתונים, וצוות React ממליץ להתחיל אפליקציה מלאה עם אחד מהם. לאפליקציה בצד הלקוח או ללמידה, Vite עם React רגיל היא נקודת התחלה קטנה ומהירה; ראו איך מתקינים React.
React מול React Native
React עצמה רק מתארת קומפוננטות ואיך הן משתנות. רנדרר נפרד הופך אותן למשהו שאפשר לראות. React DOM מרנדר לדפי ווב, וזה מה שכל הדוגמאות באתר הזה משתמשות בו. React Native מרנדר את אותו סוג של קומפוננטות לתצוגות נייטיב של iOS ו-Android, כך שכותבים <View> ו-<Text> במקום <div> ו-<p>, ואין קובץ HTML או CSS. קומפוננטות, props, state והוקים עובדים אותו דבר בשניהם, כך שמה שלומדים כאן עובר ישירות.
מתי ללמוד React
למדו React אחרי יסודות JavaScript, כי כל מה שיש ב-React הוא JavaScript. לפני שמתחילים, כדאי להרגיש בנוח עם:
- משתנים, פונקציות ופונקציות חץ
- מערכים והמתודות
mapו-filterשלהם - אובייקטים, destructuring ותחביר ה-spread (
...) importו-export- promises ו-
async/await, לטעינת נתונים
אם כל אלה מוכרים לכם, התחילו עם JSX וקומפוננטות, ואז props ו-state. אפקטים, refs, קונטקסט וכלי ביצועים מגיעים אחר כך, כשבניית קומפוננטות אינטראקטיביות קטנות כבר מרגישה טבעית.
שאלות נפוצות
למה משתמשים ב-React?
React משמשת לבניית ממשקי משתמש אינטראקטיביים: אפליקציות ווב, דשבורדים, טפסים, אפליקציות של עמוד יחיד וחלקים מאתרים רגילים. עם React Native אותו מודל קומפוננטות בונה אפליקציות iOS ו-Android.
React היא framework או ספרייה?
React היא ספרייה. היא מטפלת בקומפוננטות, ב-state וברינדור, אבל אין בה ראוטר מובנה, שכבה לטעינת נתונים או הגדרת build. Frameworks כמו Next.js ומצב ה-framework של React Router מוסיפים את אלה מעל React.
React JS ו-React זה אותו דבר?
כן. React, React JS ו-ReactJS הם שלושה שמות לאותה ספרייה. ה-"JS" נמצא שם כי React כתובה ב-JavaScript ובשבילה.
צריך לדעת JavaScript לפני שלומדים React?
כן. קומפוננטות React הן פונקציות JavaScript, ולכן כדאי להרגיש בנוח קודם עם פונקציות, מערכים (map, filter), אובייקטים, destructuring, פונקציות חץ, מודולים ו-promises.
מה ההבדל בין React ל-React Native?
React מתארת ממשקים כקומפוננטות. React DOM מרנדרת את הקומפוננטות האלה לדף ווב, ו-React Native מרנדרת אותן כתצוגות מובייל נייטיב. קומפוננטות, props, state והוקים עובדים אותו דבר בשתיהן.