Итак, я читал «Полное руководство по использованию эффекта» Дана Абрамова и Документы по хукам .
В статье Дан приводит следующий пример:
function SearchResults() {
const [query, setQuery] = useState('react');
// ✅ Preserves identity until query changes
const getFetchUrl = useCallback(() => {
return 'https://hn.algolia.com/api/v1/search?query=' + query;
}, [query]); // ✅ Callback deps are OK
useEffect(() => {
const url = getFetchUrl();
// ... Fetch data and do something ...
}, [getFetchUrl]); // ✅ Effect deps are OK
// ...
}
И документы Хука дают это:
function ProductPage({ productId }) {
// ✅ Wrap with useCallback to avoid change on every render
const fetchProduct = useCallback(() => {
// ... Does something with productId ...
}, [productId]); // ✅ All useCallback dependencies are specified
return <ProductDetails fetchProduct={fetchProduct} />;
}
function ProductDetails({ fetchProduct })
useEffect(() => {
fetchProduct();
}, [fetchProduct]); // ✅ All useEffect dependencies are specified
// ...
}
Мне было интересно: действительно ли необходимы обратный вызов и функция фабрики?
Вы также можете написать:
const getFetchUrl = useCallback('https://hn.algolia.com/api/v1/search?query=' + query, [query]);
и
useEffect(fetchProduct, [fetchProduct]);
Точно так же вы могли бы придумать сценарий, в котором вы могли бы опустить функцию создания для useMemo
:
function Greeting({ name }) {
const calculateExpensive = useCallback(() => {
return `Hello ${name}`;
}, [name]);
const result = useMemo(calculateExpensive, [calculateExpensive]);
return <p>{result}</p>;
}
Я уверен, что яЯ делаю глупую ошибку здесь.Что я не вижу и делаю неправильно?