Разработчик Брайан Арриета опубликовал в блоге на 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); };
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…