במאמר הקודם למדנו מה זה Hooks וראינו דוגמאות ל -Hooks הבסיסיים בריאקט כעת נעבור לשלב הבא ונכיר את ה-Hooks המתקדמים יותר: useMemo, useCallback, useLayoutEffect, useImperativeHandle, useDebugValue ו-useId. מאמר זה יספק דוגמאות קוד והסברים מפורטים לכל אחד מה-Hooks הללו.
useMemo
ה-Hook useMemo משמש למזעור חישובים חוזרים ולשיפור ביצועים על ידי החזרת ערך ממורכב רק כאשר אחת מהתלויות משתנה.
דוגמה:
import React, { useState, useMemo } from 'react';
function ExpensiveCalculationComponent({ num }) {
const expensiveCalculation = (num) => {
console.log("Calculating...");
return num * 2;
};
const result = useMemo(() => expensiveCalculation(num), [num]);
return <div>{result}</div>;
}
function App() {
const [number, setNumber] = useState(0);
return (
<div>
<input
type="number"
value={number}
onChange={(e) => setNumber(parseInt(e.target.value))}
/>
<ExpensiveCalculationComponent num={number} />
</div>
);
}
במקרה זה, useMemo מבצע חישוב כבד רק כאשר הערך של num
משתנה.
useCallback
ה-Hook useCallback מחזיר גרסה ממורכבת של פונקציה אשר משתנה רק אם אחת מהתלויות שלה משתנה. זה שימושי במיוחד כאשר מעבירים פונקציות לקומפוננטות ילד.
דוגמה:
import React, { useState, useCallback } from 'react';
const Button = React.memo(({ handleClick }) => {
console.log("Button re-rendered");
return <button onClick={handleClick}>Click me</button>;
});
function App() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount((prevCount) => prevCount + 1);
}, []);
return (
<div>
<p>Count: {count}</p>
<Button handleClick={increment} />
</div>
);
}
במקרה זה, useCallback מבטיח שהפונקציה increment
לא תשתנה בין רינדורים אלא אם התלויות שלה משתנות.
useLayoutEffect
ה-Hook useLayoutEffect פועל כמו useEffect אך מתבצע לאחר כל רינדור ולאחר עדכון ה-DOM.
דוגמה:
import React, { useState, useMemo } from 'react';
function ExpensiveCalculationComponent({ num }) {
const expensiveCalculation = (num) => {
console.log("Calculating...");
return num * 2;
};
const result = useMemo(() => expensiveCalculation(num), [num]);
return <div>{result}</div>;
}
function App() {
const [number, setNumber] = useState(0);
return (
<div>
<input
type="number"
value={number}
onChange={(e) => setNumber(parseInt(e.target.value))}
/>
<ExpensiveCalculationComponent num={number} />
</div>
);
}
במקרה זה, useLayoutEffect מאפשר גישה ל-DOM לאחר כל רינדור.
useImperativeHandle
ה-Hook useImperativeHandle מאפשר לקומפוננטות חשיפה של ערכים ופונקציות מסוימות דרך ה-Ref שלהן.
דוגמה:
import React, { useRef, useImperativeHandle, forwardRef } from 'react';
const FancyInput = forwardRef((props, ref) => {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
focus: () => {
inputRef.current.focus();
},
clear: () => {
inputRef.current.value = "";
},
}));
return <input ref={inputRef} />;
});
function App() {
const fancyInputRef = useRef();
return (
<div>
<FancyInput ref={fancyInputRef} />
<button onClick={() => fancyInputRef.current.focus()}>Focus</button>
<button onClick={() => fancyInputRef.current.clear()}>Clear</button>
</div>
);
}
במקרה זה, useImperativeHandle מאפשר גישה לפונקציות focus ו-clear של הקומפוננטה FancyInput.
useDebugValue
ה-Hook useDebugValue משמש להצגת ערכים במצב דיבוג.
דוגמה:
import React, { useState, useDebugValue } from 'react';
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
useDebugValue(isOnline ? 'Online' : 'Offline');
// דמיוני קוד להתחברות לסטטוס של חבר
return isOnline;
}
function FriendListItem({ friendID }) {
const isOnline = useFriendStatus(friendID);
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{friendID}
</li>
);
}
במקרה זה, useDebugValue מציג מידע על סטטוס החבר בזמן דיבוג.
useId
ה-Hook useId משמש ליצירת מזהים ייחודיים שניתן להשתמש בהם ב-HTML.
דוגמה:
import React, { useId } from 'react';
function Form() {
const id = useId();
return (
<div>
<label htmlFor={`${id}-name`}>Name</label>
<input id={`${id}-name`} type="text" />
</div>
);
}
function App() {
return (
<div>
<Form />
</div>
);
}
במקרה זה, useId יוצר מזהה ייחודי עבור אלמנטים בטופס.
סיכום
React Hooks המתקדמים מאפשרים למפתחים לכתוב קוד אפקטיבי, ממוקד וביצועים טובים יותר. במאמר זה סקרנו את ה-Hooks useMemo, useCallback, useLayoutEffect, useImperativeHandle, useDebugValue ו-useId, יחד עם דוגמאות קוד והסברים לביצוע.
אם מעניין אותכם להתמקצע בריאקט או לעשות הסבה טכנולוגית לצוות שלכם, מוזמנים לדבר איתנו על קורס React