בלי לחץ… בוא ננסה כיוון אחר-
תחשוב על פקד ריאקט כמו קופסא שיש לה גרעין של ידע,
אבל אתה יכול להציץ עליו מכל מיני חורים והחורים באים בכל מיני צורות,
ולפי החור דרכו אתה מסתכל אתה רואה את הידע הזה בצורה אחרת או בצבע אחר
כאילו שיש שקף צבעוני שמכסה כל חור ואז מכיוון אחר זה נראה אדום ומכיוון אחר ירוק,
אבל זה אותו דבר בפנים
ככה לגבי השעון שלנו:
יש לו את val שמייצג את השניות,
אבל על ה val הזה אפשר להסתכל בכל מיני דרכים,
למשל אם מחלקים אותו ב-60 מקבלים מספר אחר,
שהוא הדקות,
אבל זה כמובן אותו מספר
הנה דוגמא של שעון שאי אפשר לשנות אותו - רק לראות את הערך,
וכל ערך שאתה כותב ב val מופיע ב-3 צורות שונות: שניות, דקות ושעות
(לחץ על הכפתור באמצע כדי לראות את הקוד ולהפעיל)
…
עכשיו מה קורה כשהערך הזה משתנה?
או יותר נכון איך קורה שהוא משתנה?
אז הפונקציה render היא הדרך לחשוף את הידע הפנימי של הפקד
כלפי חוץ
ולהציג אותו בכל מיני אופנים.
בנוסף אליה פקד יכול להגדיר Event Handlers שיופעלו כשאירוע מסוים קורה
הנה למשל הרחבה של הפקד הקודם שיכיל גם כפתור ו Event Handler שיופעל כשלוחצים על הכפתור,
כך שכשלוחצים על הכפתור יוגרל ערך חדש ל val:
בתרגיל שלנו Event Handlers מסוימים צריכים להתיחס גם למידע שהיה קשור לאירוע. למשל האירוע היה שינוי קלט בתיבת טקסט, ולכן ה Event Handler צריך לקחת את הקלט החדש שהוכנס.
בוא נעזוב רגע את השעון וננסה משהו יותר פשוט עם Event Handler שמתיחס לקלט שהוכנס. הפקד בדוגמא הבאה מכיל שדה טקסט ולידו מספר. כל פעם שמשנים את הטקסט בתיבה המספר מציג את אורך הטקסט:
מה קורה כאן? אז מבחינת הידע שוב יש לנו רק דבר אחד שצריך ״לדעת״ והוא הטקסט.
הטקסט מוצג בשתי דרכים: התיבה מציגה את הטקסט עצמו, והטקסט לידה מציג את האורך שלו,
אבל שני הדברים הם רק דרכים שונות להסתכל על אותו דבר - על הטקסט.
קוד הטיפול באירוע משנה את הטקסט
כך שכל פעם שמשתנה הטקסט בתיבה גם המצב הפנימי משתנה בהתאמה
הטקסט שמשתמש מכניס הופך בדיוק לטקסט החדש
אבל זה לא חייב להיות כך,
כי למשל אפשר להחליט שאנחנו לא רוצים חלק מהאותיות
אולי אנחנו לא אוהבים את האות e אז כל פעם שמשתמש משנה
את הטקסט, אנחנו נמחק את כל ה e מהקלט לפני שנכניס אותו להיות
הסטייט החדש:
אבל רגע עוד לא סיימנו עם התיבות,
כי אפשר להוסיף עוד תיבת טקסט
שתשתמש ב Event Handler שונה:
התיבה השמאלית תמחק לך את ה e מהקלט,
התיבה הימנית לא
ובשני המקרים בסופו של דבר הקלט ייכנס ל state
ואז ישפיע על התיבה השניה וגם על הטקסט שמציג את האורך שלו
כלומר יש כאן שני תהליכים נפרדים: האחד קובע איך מידע
נכנס ל State דרך Event Handler
והשני קובע איך מידע ב State מוצג דרך הפונקציה render.
…
עכשיו בחזרה לשעון-
גם שם יש לנו מספר Event Handlers,
וכל אחד מתנהג קצת אחרת:
ה Event Handler שנקרא כשמשנים את ערך השעות למשל
ייקח את הערך החדש שהוא קיבל,
יכפיל אותו ב 3,600
וזה הערך שיכניס לסטייט.
ה Event Handler שנקרא כשמשנים את הדקות ייקח את המספר
יכפיל הפעם רק ב 60
ואת זה יכניס לסטייט
וה Event Handler שנקרא כשמשנים את השניות
פשוט שומר בסטייט בדיוק את הערך שקיבל
בלי לשנות אותו.
התהליך השני, ה render לוקח את הערך ומציג אותו ב-3 דרכים,
בדיוק כמו שכתבת:
פעם אחת מחלק ב 3,600 כדי להציג את הערך כ״שעות״
פעם שניה מחלק ב 60 כדי להציג את הערך ב״דקות״
ופעם שלישית משאיר כמו שהוא כדי להציג את ה״שניות״
וזה כל הסיפור עם סטייט בריאקט
סטייט נשמר ״בתוך״ הפקד
יוצא דרך render
ומשתנה דרך Event Handlers
(או מתוך Lifecycle Functions אבל זה כבר נושא להמשך הקורס 