What to do:
-
Use useState to manage local state:
const [count, setCount] = useState(0);
-
Use useEffect for side effects (e.g., API calls):
useEffect(() => {
fetchData();
}, [dependencies]);
Example:
A counter component using both hooks:
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
return (
<button onClick={() => setCount(count + 1)}>
Clicked {count} times
</button>
);
}
What to do:
-
Define a reducer function:
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
default:
return state;
}
}
-
Initialize useReducer:
const [state, dispatch] = useReducer(reducer, { count: 0 });
Example:
A todo list using useReducer:
dispatch({ type: 'add', payload: 'New Task' });
What to do:
-
Memoize expensive calculations:
const result = useMemo(() => computeExpensiveValue(a, b), [a, b]);
-
Cache functions with useCallback:
const handleClick = useCallback(() => {
}, [dependencies]);
Example:
A filtered list using useMemo:
const filteredList = useMemo(
() => items.filter(item => item.price > 100),
[items]
);