React Hooks מובנים
Hooks מאפשרים להשתמש ביכולות שונות של React מתוך קומפוננטות. אפשר להשתמש ב-Hooks המובנים, או לשלב ביניהם כדי לבנות Hooks משלכם. העמוד הזה מציג את כל ה-Hooks המובנים ב-React.
State Hooks
State מאפשר לקומפוננטה “לזכור” מידע כמו קלט מהמשתמש. לדוגמה, קומפוננטת טופס יכולה להשתמש ב-state כדי לשמור את ערך הקלט, בעוד קומפוננטת גלריית תמונות יכולה להשתמש ב-state כדי לשמור את אינדקס התמונה שנבחרה.
כדי להוסיף state לקומפוננטה, השתמשו באחד מה-Hooks הבאים:
useStateמצהיר על משתנה state שאפשר לעדכן ישירות.useReducerמצהיר על משתנה state עם לוגיקת העדכון בתוך פונקציית reducer.
function ImageGallery() {
const [index, setIndex] = useState(0);
// ...Context Hooks
Context מאפשר לקומפוננטה לקבל מידע מהורים רחוקים בלי להעביר אותו כ-props. לדוגמה, קומפוננטת העליונה של האפליקציה יכולה להעביר את ערכת הנושא הנוכחית לכל הקומפוננטות מתחתיה, לא משנה כמה עמוק הן נמצאות.
useContextקורא ל-context ונרשם אליו.
function Button() {
const theme = useContext(ThemeContext);
// ...Ref Hooks
Refs מאפשרים לקומפוננטה להחזיק מידע שלא משמש לרינדור, כמו DOM node או מזהה timeout. בניגוד ל-state, עדכון של ref לא מרנדר מחדש את הקומפוננטה. Refs הם “escape hatch” מהפרדיגמה של React. הם שימושיים כשצריך לעבוד עם מערכות שאינן React, כמו APIs מובנים של הדפדפן.
useRefמצהיר על ref. אפשר לשמור בו כל ערך, אבל לרוב משתמשים בו כדי לשמור DOM node.useImperativeHandleמאפשר להתאים אישית את ה-ref שהקומפוננטה חושפת. זה בשימוש נדיר.
function Form() {
const inputRef = useRef(null);
// ...Effect Hooks
Effects מאפשרים לקומפוננטה להתחבר ולהסתנכרן עם מערכות חיצוניות. זה כולל עבודה עם רשת, DOM של הדפדפן, אנימציות, ווידג’טים שנכתבו בספריית UI אחרת, וקוד נוסף שאינו React.
useEffectמחבר קומפוננטה למערכת חיצונית.
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...Effects הם “escape hatch” מהפרדיגמה של React. אל תשתמשו ב-Effects כדי לתזמר את זרימת הנתונים של האפליקציה. אם אתם לא מקיימים אינטראקציה עם מערכת חיצונית, יכול להיות שאין צורך ב-Effect.
יש שתי וריאציות נדירות יותר של useEffect עם הבדלים בתזמון:
useLayoutEffectמופעל לפני שהדפדפן מצייר מחדש את המסך. אפשר למדוד layout כאן.useInsertionEffectמופעל לפני ש-React מבצעת שינויים ב-DOM. ספריות יכולות להכניס כאן CSS דינמי.
Performance Hooks
דרך נפוצה לאופטימיזציה של ביצועי רינדור מחדש היא לדלג על עבודה מיותרת. לדוגמה, אפשר לבקש מ-React להשתמש מחדש בחישוב שמור או לדלג על רינדור חוזר אם הנתונים לא השתנו מאז הרינדור הקודם.
כדי לדלג על חישובים ורינדורים מיותרים, השתמשו באחד מה-Hooks הבאים:
useMemoמאפשר לשמור במטמון תוצאה של חישוב יקר.useCallbackמאפשר לשמור במטמון הגדרת פונקציה לפני שמעבירים אותה לקומפוננטה ממוטבת.
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}לפעמים אי אפשר לדלג על רינדור מחדש כי המסך באמת צריך להתעדכן. במקרה כזה אפשר לשפר ביצועים על ידי הפרדה בין עדכונים חוסמים שחייבים להיות סינכרוניים (כמו הקלדה בשדה קלט) לבין עדכונים לא-חוסמים שלא צריכים לחסום את ממשק המשתמש (כמו עדכון גרף).
כדי לתעדף רינדור, השתמשו באחד מה-Hooks הבאים:
useTransitionמאפשר לסמן מעבר state כלא-חוסם ולאפשר לעדכונים אחרים להפריע לו.useDeferredValueמאפשר לדחות עדכון של חלק לא-קריטי ב-UI ולאפשר לחלקים אחרים להתעדכן קודם.
Resource Hooks
Resources ניתנים לגישה מתוך קומפוננטה גם בלי להיות חלק מה-state שלה. לדוגמה, קומפוננטה יכולה לקרוא הודעה מתוך Promise או מידע עיצובי מתוך context.
כדי לקרוא ערך ממשאב, השתמשו ב-Hook הבא:
function MessageComponent({ messagePromise }) {
const message = use(messagePromise);
const theme = use(ThemeContext);
// ...
}Hooks נוספים
ה-Hooks האלה שימושיים בעיקר למחברי ספריות, ולא בשימוש נפוץ בקוד אפליקטיבי.
useDebugValueמאפשר להתאים את התווית ש-React DevTools מציג עבור custom Hook.useIdמאפשר לקומפוננטה לשייך לעצמה מזהה ייחודי. לרוב בשילוב עם APIs של נגישות.useSyncExternalStoreמאפשר לקומפוננטה להירשם לחנות חיצונית.
Hooks משלכם
אפשר גם להגדיר custom Hooks משלכם כפונקציות JavaScript.