הייתי ממליץ להשתמש באירוע submit של הטופס במקום ב onClick של הכפתור
נדמה לי שגם name צריך להישמר בסטייט כדי שאפשר יהיה להשתמש בו
הנקודה הכי חשובה - אנחנו (משתמשים) לא אוהבים הודעות שגיאה שמוצגות עם alert. הרבה יותר טוב יהיה להציג קטע של “שגיאות” בראש הטופס שמפרט מה היה לא בסדר, ומתחת לשדה הסיסמה לכתוב את השגיאה הספציפית של השדה. נסי לחשוב איך לממש התנהגות כזאת, מה צריך להישמר בסטייט וכו’.
לגבי ריענון הטופס - בדרך כלל כשאת מגישה טופס את תגישי אותו לאיזשהו צד שרת. אותו צד שרת יצטרך להגיד שהנתונים לא וולידיים ויחזיר לך את הנתונים שהקלדת. בשביל לטפל בריענון בצד לקוח בלבד אפשר לשמור את המידע שמשתמש הקליד ב local storage ואז לטעון משם כשהטופס עולה. אפשר ללמוד על local storage מהשיעור עליו כאן: https://www.tocode.co.il/bundles/frontend/lessons/localstorage
שווה בשביל המשחק גם לנסות לממש התנהגות כמו שתיארת.
השם componentDidUpdate הוא בעל משמעות בריאקט - זה שם שמור בכתיב המחלקות. בקוד שלך אין התנגשות אבל זה עדיין מבלבל לראות אותו. נסי לבחור שם יותר רלוונטי למה שקורה כמו handleClick.
אני רואה שבעקבות לחיצת עכבר על אחד המלבנים את מעדכנת את הפוקוס של המלבן, אבל אני לא חושב שזה הכרחי. לחיצת העכבר כבר גורמת להזזת הפוקוס (אוטומטית, בגלל הדפדפן). מה שצריך לעשות בפונקציה שמטפלת בלחיצה הוא לעדכן את המשתנה onfocus כדי שהוא יהיה מסונכרן עם המלבן שעכשיו נמצא בפוקוס.
הדבר הבא שחסר זה שאחרי כל לחיצה (ב changeTav שלך) צריך להזיז את הפוקוס למלבן הבא. אנחנו יודעים מה האינדקס של המלבן שבו כתבו את הטקסט ולכן אפשר למצוא את האינדקס של המלבן שבא אחריו ולתת לו פוקוס: