7.2 הוקים מותאמים אישית תרגול
תרגול - הוקים מותאמים אישית - Custom Hooks¶
תרגיל 1 - הוק useCounter¶
צרו הוק מותאם אישית לניהול מונה.
דרישות:
- הוק שמקבל ערך התחלתי, ערך מינימלי וערך מקסימלי (אופציונליים)
- מחזיר: count, increment, decrement, reset, setCount
- הפונקציות increment ו-decrement לא חורגות מהגבולות
- צרו קומפוננטה שמשתמשת בהוק ומציגה את המונה עם כפתורים
תרגיל 2 - הוק useForm¶
צרו הוק לניהול טפסים.
דרישות:
- הוק שמקבל ערכים התחלתיים ופונקציית ולידציה
- מחזיר: values, errors, handleChange, handleSubmit, reset, isValid
- הפונקציה handleChange מעדכנת שדה ספציפי לפי name
- הולידציה רצה על כל שינוי ועל submit
- צרו טופס הרשמה עם שדות: שם (חובה, לפחות 2 תווים), אימייל (חובה, פורמט תקין), סיסמה (חובה, לפחות 6 תווים), אישור סיסמה (חייב להתאים לסיסמה)
תרגיל 3 - הוק useAsync¶
צרו הוק לניהול פעולות אסינכרוניות.
דרישות:
- הוק שמקבל פונקציה אסינכרונית
- מחזיר: execute, data, loading, error, reset
- הפונקציה execute מריצה את הפעולה האסינכרונית ומנהלת את ה-state
- תמיכה בביטול (אם הקומפוננטה מתפרקת בזמן הטעינה, לא לעדכן state)
- צרו קומפוננטה שמדמה טעינת נתונים עם כפתור לטעינה מחדש
תרגיל 4 - הוק useKeyPress¶
צרו הוק שמזהה לחיצות מקשים.
דרישות:
- הוק שמקבל מקש (או שילוב מקשים) ופונקציית callback
- תמיכה ב-modifier keys (Ctrl, Shift, Alt)
- אפשרות להגדיר אם ההוק פעיל או לא
- צרו קומפוננטה שמגיבה ל: Escape (סגירת modal), Ctrl+S (שמירה), מקשי חיצים (ניווט)
תרגיל 5 - הוק useIntersectionObserver¶
צרו הוק שעוטף את Intersection Observer API.
דרישות:
- הוק שמקבל אפשרויות (threshold, rootMargin) ומחזיר ref ו-isIntersecting
- השתמשו בהוק לבניית: רשימה אינסופית (טעינת פריטים נוספים כשמגיעים לסוף), אנימציית כניסה (אלמנטים שמופיעים כשנגללים אליהם)
- הדגימו שימוש בשני המקרים
תרגיל 6 - הוק useWebSocket (מתקדם)¶
צרו הוק לניהול חיבור WebSocket.
דרישות:
- הוק שמקבל URL ומנהל חיבור WebSocket
- מחזיר: sendMessage, lastMessage, connectionStatus, connect, disconnect
- תמיכה ב-reconnect אוטומטי עם backoff
- ניקוי החיבור כשהקומפוננטה מתפרקת
- צרו קומפוננטת צ'אט פשוטה שמשתמשת בהוק (אפשר לדמות שרת עם console.log)
שאלות¶
- מתי כדאי לחלץ לוגיקה להוק מותאם אישית ומתי עדיף להשאיר אותה בקומפוננטה?
- מה קורה כששני instances של אותו הוק רצים באותה קומפוננטה? האם הם חולקים state?
- למה חשוב שהשם של הוק מותאם אישית יתחיל ב-use? מה קורה אם לא?
- כיצד אפשר לבדוק הוק מותאם אישית שתלוי ב-DOM API (כמו useMediaQuery)?
- מה היתרון של החזרת אובייקט מהוק לעומת החזרת מערך? מתי נעדיף כל גישה?