Разработчик Брайан Арриета опубликовал в блоге на dev.to пять лучших, на его взгляд, кастомных React Hooks. Вот они.
Позволяет реализовать метод setTimeout JavaScript с помощью декларативного подхода:
import { useEffect, useRef } from 'react';
const useTimeout = (callback, timeout) => {
const savedCallback = useRef(null);
savedCallback.current = callback;
useEffect(
() => {
savedCallback.current = callback;
},
[callback]
);
useEffect(
() => {
if (timeout) {
const timeoutId = setTimeout(() => {
savedCallback.current();
}, timeout);
return () => clearTimeout(timeoutId)
}
},
[timeout]
)
} Пример использования:
import { useState } from 'react';
const ExampleComponent = () => {
const [message, setMessage] = useState('');
useTimeout(() => {
setMessage('Hello World');
}, 7500);
return (<p>{message}</p>);
} С помощью этого хука можно получить доступ к предыдущему состоянию, связанному с компонентами.
import { useEffect, useRef } from 'react';
const usePrevious = (state) => {
const ref = useRef();
useEffect(() => {
ref.current = state;
});
return ref.current;
} Пример использования:
import { useState } from 'react';
const ExampleComponent = () => {
const [counter, setCounter] = useState(0);
const previousCounter = usePrevious(counter);
return (
<>
<p>Counter: {counter}</p>
<p>Previous Counter: {previousCounter}</p>
<button onClick={() => setCounter(counter + 1)}>Next</button>
</>
);
} Позволяет реализовать метод setInterval JavaScript с помощью декларативного подхода.
import { useEffect, useRef } from 'react';
const useInterval = (callback, delay) => {
const savedCallback = useRef(null);
savedCallback.current = callback;
useEffect(
() => {
savedCallback.current = callback;
},
[callback]
);
useEffect(
() => {
if (delay) {
const intervalId = setInterval(() => {
savedCallback.current();
}, delay);
return () => clearInterval(intervalId)
}
},
[delay]
)
} Пример использования:
import { useState } from 'react';
const ExampleComponent = () => {
const [seconds, setSeconds] = useState(0);
useInterval(() => {
setSeconds(seconds + 1);
}, 1000);
return <p> Seconds passed: {seconds}</p>;
} Может использоваться для декларативной выборки и помогает при загрузку и ошибках.
import { useState, useEffect } from 'react';
const useFetch = (initialUrl, initialOptions = {}) => {
const [url, setUrl] = useState(initialUrl);
const [options, setOptions] = useState(initialOptions);
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
const fetchData = async() => {
try {
setIsLoading(true);
const response = await fetch(url, options);
const json = await response.json();
setData(json);
} catch (err) {
setError(err);
} finally {
setIsLoading(false);
}
}
fetchData();
}, [url, options]);
return ({data, error, isLoading, setUrl, setOptions});
}; Пример использования:
const URL = 'https://jsonplaceholder.typicode.com/todos';
const ExampleComponent = () {
const { data, error, isLoading } = useFetch(URL);
if(isLoading) {
return (<p>Loading...</p>)
}
if (error) {
return <p>{error?.message}</p>;
}
const renderItem = ({id, title})=> (
<div key = {`item-${id}`}>
<p>{id} - {title}</p>
</div>
);
return data.map(renderItem);
} Перехватчик useConstructor может использоваться для реализации того же поведения, что и компоненты класса.
import React from 'react';
export const useConstructor = (callBack = () => {}) => {
const [hasBeenCalled, setHasBeenCalled] = React.useState(false);
if (hasBeenCalled) return;
callBack();
setHasBeenCalled(true);
};
На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…