react-use-utils v1.1.0
react-use-utils
Essa lib é um conjunto de hooks que facilitam o desenvolvimento de aplicações React. Ela foi criada para ser utilizada em conjunto com o create-react-app e o Typescript.
Instalação
npm install react-use-utilsUso
import React from 'react';
import { useLocalStorage } from 'react-use-utils';
const App: React.FC = () => {
const [name, setName] = useLocalStorage('name', 'John Doe');
return (
<div>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
);
};Hooks
useOptimistic
useOptimistic<T = any, V = any>(
state: T,
updateFn: (currentState: T, optimisticValue: V) => T
): [T, (value: V) => void]Hook que permite atualizar o estado de forma otimista.
state: Estado atual.updateFn: Função que atualiza o estado de forma otimista.value: Valor otimista.return: Retorna o estado atual e uma função para adicionar um valor otimista.
import React from 'react';
import { useOptimistic } from 'react-use-utils';
const App: React.FC = () => {
const [messages, setMessages] = useState([]);
const [optimisticMessages, addOptimisticMessage] = useOptimistic(messages, (currentState, optimisticValue) => {
return [...currentState, {...optimisticValue, sending: true}];
});
const addMessage = (message) => {
addOptimisticMessage(message);
fetch('https://api.example.com/messages', {
method: 'POST',
body: JSON.stringify(message),
}).then(() => {
setMessages([...messages, message]);
});
};
return (
<div>
{optimisticMessages.map((message) => (
<div key={message.id}>{message.text}</div>
))}
<button onClick={() => addMessage({ id: messages.length, text: 'Hello' })}>
Add message
</button>
</div>
);
};useId
useId(idName?: string): stringGancho para gerar um ID exclusivo.
idName: Nome do ID.return: Retorna um ID exclusivo.
import React from 'react';
import { useId } from 'react-use-utils';
const App: React.FC = () => {
const id = useId();
return <div id={id}>Hello World</div>;
};useProxy
useProxy<T extends object>(target: T, onChange?: (target: T) => void): TObserva as alterações em um objeto e executa uma função de retorno quando ocorre uma mudança.
target: Objeto alvo.onChange: Função de retorno.return: Retorna um objeto proxy.
import React from 'react';
import { useProxy } from 'react-use-utils';
const App: React.FC = () => {
const user = useProxy({ name: 'John Doe', age: 30 }, (newUser) => {
console.log('User changed:', newUser);
});
return (
<div>
<input
type="text"
value={user.name}
onChange={(e) => {
user.name = e.target.value
}}
/>
</div>
);
};useDebounceCallbackEffect
useDebounceCallbackEffect(
callback: () => void,
delay: number,
dependencies: any[]
): voidHook que executa um callback após um determinado tempo de espera (delay), mas só executa uma vez, mesmo que as dependências mudem antes do fim do delay.
callback: Função de retorno.delay: Tempo de espera.dependencies: Dependências.return: Retornavoid.
import React, { useState } from 'react';
import { useDebounceCallbackEffect } from 'react-use-utils';
const App: React.FC = () => {
const [value, setValue] = useState('');
const [debouncedValue, setDebouncedValue] = useState('');
useDebounceCallbackEffect(() => {
setDebouncedValue(value);
}, 500, [value]);
return (
<div>
<input
type="text"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
<p>Debounced value: {debouncedValue}</p>
</div>
);
};useDebounce
useDebounce<T = any>(value: T, delay: number): THook que retorna um valor após um determinado tempo de espera (delay).
value: Valor.delay: Tempo de espera.return: Retorna o valor após o tempo de espera.
import React, { useState } from 'react';
import { useDebounce } from 'react-use-utils';
const App: React.FC = () => {
const [value, setValue] = useState('');
const debouncedValue = useDebounce(value, 500);
return (
<div>
<input
type="text"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
<p>Debounced value: {debouncedValue}</p>
</div>
);
};useWindowSize
useWindowSize(): { width: number; height: number }Hook que retorna a largura e a altura da janela do navegador.
width: Largura da janela.height: Altura da janela.return: Retorna a largura e a altura da janela.
import React from 'react';
import { useWindowSize } from 'react-use-utils';
const App: React.FC = () => {
const { width, height } = useWindowSize();
return (
<div>
<p>Width: {width}</p>
<p>Height: {height}</p>
</div>
);
};useAsync
useAsync<T = any>(asyncFunction: (...props: any[]) => Promise<T>, immediate?: boolean): {
execute: (...props: any[]) => Promise<void>;
status: "idle" | "pending" | "success" | "error";
value: T | null;
error: any;
}Hook que executa uma função assíncrona e retorna o status da execução, o valor retornado e o erro, caso ocorra.
asyncFunction: Função assíncrona.immediate: Setrue, a função é executada imediatamente.execute: Função para executar a função assíncrona.status: Status da execução.value: Valor retornado.error: Erro, caso ocorra.return: Retorna um objeto com as propriedadesexecute,status,valueeerror.
import React from 'react';
import { useAsync } from 'react-use-utils';
const fetchData = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
return response.json();
};
const App: React.FC = () => {
const { execute, status, value, error } = useAsync(fetchData, false);
return (
<div>
{status === 'idle' && <div>Start your journey by clicking a button</div>}
{status === 'pending' && <div>Loading...</div>}
{status === 'success' && <div>{JSON.stringify(value)}</div>}
{status === 'error' && <div>{error.message}</div>}
<button onClick={execute} disabled={status === 'pending'}>
{status !== 'pending' ? 'Click me' : 'Loading...'}
</button>
</div>
);
};useToggle
useToggle(initialValue: boolean): [boolean, () => void]Hook que retorna um valor booleano e uma função para alternar entre true e false.
initialValue: Valor inicial.return: Retorna um array com o valor booleano e a função para alternar.value: Valor booleano.toggle: Função para alternar.return: Retorna um array com o valor booleano e a função para alternar.
import React from 'react';
import { useToggle } from 'react-use-utils';
const App: React.FC = () => {
const [isOn, toggle] = useToggle(false);
return (
<div>
<p>{isOn ? 'ON' : 'OFF'}</p>
<button onClick={toggle}>Toggle</button>
</div>
);
};useRouter
useRouter(path?: string | string[] | RegExp | RegExp[]): {
go: (delta: number) => void;
back: () => void;
forward: () => void;
push: (url: string, state?: any) => void;
replace: (url: string, state?: any) => void;
state: any;
hash: string;
pathname: string;
query: any;
search: string;
length: number;
currentIndex: number;
}Hook que retorna informações sobre a rota atual e funções para navegar entre as rotas.
path: Caminho da rota de referência. Útil para ferificar se a rota atual corresponde a um caminho específico. Se for um array, verifica se a rota atual corresponde a qualquer um dos caminhos no array. Se for uma expressão regular, verifica se a rota atual corresponde à expressão regular. Se for um array de expressões regulares, verifica se a rota atual corresponde a qualquer uma das expressões regulares no array.go: Navega para uma rota específica.back: Navega para a rota anterior.forward: Navega para a próxima rota.push: Adiciona uma nova rota ao histórico.replace: Substitui a rota atual.state: Estado da rota.hash: Hash da rota.pathname: Caminho da rota.query: Query string da rota.exact: Setrue, a rota atual corresponde exatamente ao caminho de referência.params: Parâmetros da rota.search: Parâmetros da query string.query: Junção dos parâmetros da rota e da query string.path: Caminho da rota de referência válida.pathValid: Rota de referência válida....: Parâmetros da rota e derivados.
search: Parâmetros da query string.length: Número de rotas no histórico.currentIndex: Índice da rota atual.return: Retorna um objeto com as propriedadesgo,back,forward,push,replace,state,hash,pathname,query,search,lengthecurrentIndex.
import React from 'react';
import { useRouter } from 'react-use-utils';
const App: React.FC = () => {
const { pathname, query, push } = useRouter();
return (
<div>
<p>Pathname: {pathname}</p>
<p>Query: {JSON.stringify(query)}</p>
<button onClick={() => push('/about')}>Go to About</button>
</div>
);
};useEventListener
useEventListener<E extends HTMLElement, K extends keyof GlobalEventHandlersEventMap>(
element: React.RefObject<E | null>,
eventName: K,
eventHandler: (event: GlobalEventHandlersEventMap[K]) => void,
wantsUntrusted?: boolean
): voidHook que adiciona um ouvinte de eventos a um elemento.
element: Elemento.eventName: Nome do evento.eventHandler: Função de retorno.wantsUntrusted: Setrue, o ouvinte de eventos também recebe eventos não confiáveis.return: Retornavoid.
import React, { useRef } from 'react';
import { useEventListener } from 'react-use-utils';
const App: React.FC = () => {
const buttonRef = useRef<HTMLButtonElement>(null);
useEventListener(buttonRef, 'click', () => {
console.log('Button clicked');
});
return (
<div>
<button ref={buttonRef}>Click me</button>
</div>
);
};useMediaQuery
useMediaQuery<T = any>(queries: {
[query: string]: T;
}, defaultValue: T): THook que retorna um valor com base em uma consulta de mídia.
queries: Consultas de mídia.defaultValue: Valor padrão.return: Retorna um valor com base na consulta de mídia.
import React from 'react';
import { useMediaQuery } from 'react-use-utils';
const App: React.FC = () => {
const theme = useMediaQuery(
{
'(prefers-color-scheme: dark)': 'dark',
'(prefers-color-scheme: light)': 'light',
},
'light'
);
const device = useMediaQuery(
{
'(min-width: 1000px)': 'desktop',
'(min-width: 600px)': 'tablet',
'(max-width: 599px)': 'mobile',
},
'mobile'
);
return (
<div>
<p>Theme: {theme}</p>
<p>Device: {device}</p>
</div>
);
};useStateHistory
useStateHistory<T = any>(initialPresent: T): {
state: T;
set: (newPresent: T) => void;
undo: () => void;
redo: () => void;
clear: () => void;
canUndo: boolean;
canRedo: boolean;
}Hook que gerencia o histórico de estados.
initialPresent: Estado inicial.state: Estado atual.set: Função para definir um novo estado.undo: Função para desfazer a última ação.redo: Função para refazer a última ação.clear: Função para limpar o histórico.canUndo: Setrue, é possível desfazer a última ação.canRedo: Setrue, é possível refazer a última ação.return: Retorna um objeto com as propriedadesstate,set,undo,redo,clear,canUndoecanRedo.
import React from 'react';
import { useStateHistory } from 'react-use-utils';
const App: React.FC = () => {
const { state, set, undo, redo, clear, canUndo, canRedo } = useStateHistory(0);
return (
<div>
<p>Value: {state}</p>
<button onClick={() => set(state + 1)}>Increment</button>
<button onClick={() => set(state - 1)}>Decrement</button>
<button onClick={undo} disabled={!canUndo}>
Undo
</button>
<button onClick={redo} disabled={!canRedo}>
Redo
</button>
<button onClick={clear}>Clear</button>
</div>
);
};useScript
useScript(src: string): "error" | "idle" | "loading" | "ready"Hook que carrega um script.
src: URL do script.return: Retorna o status do script.
import React from 'react';
import { useScript } from 'react-use-utils';
const App: React.FC = () => {
const status = useScript('https://code.jquery.com/jquery-3.6.0.min.js');
return <p>Script status: {status}</p>;
};useKeyPress
useKeyPress(targetKey: KeyboardEvent["key"], callback: (pressed:boolean) => void): voidHook que executa um callback quando uma tecla é pressionada.
targetKey: Tecla alvo.callback: Função de retorno.return: Retornavoid.
import React from 'react';
import { useKeyPress } from 'react-use-utils';
const App: React.FC = () => {
useKeyPress('Enter', (pressed) => {
console.log('Enter key pressed:', pressed);
});
return <div>Press Enter key</div>;
};useOnScreen
useOnScreen<T extends HTMLElement>(
ref: React.RefObject<T>,
rootMargin?: string
): booleanHook que verifica se um elemento está visível na tela.
ref: Referência do elemento.rootMargin: Margem do elemento.return: Retornatruese o elemento estiver visível.
import React, { useRef } from 'react';
import { useOnScreen } from 'react-use-utils';
const App: React.FC = () => {
const ref = useRef<HTMLDivElement>(null);
const isVisible = useOnScreen(ref, '-100px');
return (
<div>
<div style={{ height: '100vh' }}>Scroll down</div>
<div ref={ref} style={{ height: '100vh', background: isVisible ? 'red' : 'blue' }}>
{isVisible ? 'Visible' : 'Not visible'}
</div>
</div>
);
};usePrevious
usePrevious<T = any>(value: T): T | undefinedHook que retorna o valor anterior.
value: Valor atual.return: Retorna o valor anterior.
import React, { useState } from 'react';
import { usePrevious } from 'react-use-utils';
const App: React.FC = () => {
const [count, setCount] = useState(0);
const previousCount = usePrevious(count);
return (
<div>
<p>Previous count: {previousCount}</p>
<p>Current count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
};useOnClickOutside
useOnClickOutside<T extends HTMLElement>(
ref: React.RefObject<T>,
handler: (event: MouseEvent | TouchEvent) => void
): voidHook que executa um callback quando um clique fora de um elemento é detectado.
ref: Referência do elemento.handler: Função de retorno.return: Retornavoid.
import React, { useRef } from 'react';
import { useOnClickOutside } from 'react-use-utils';
const App: React.FC = () => {
const ref = useRef<HTMLDivElement>(null);
useOnClickOutside(ref, () => {
console.log('Clicked outside');
});
return (
<div>
<div ref={ref} style={{ width: 200, height: 200, background: 'red' }}>
Click outside
</div>
</div>
);
};useHover
useHover<T extends HTMLElement>(ref: React.RefObject<T>): booleanHook que verifica se um elemento está sendo passado o mouse por cima.
ref: Referência do elemento.return: Retornatruese o mouse estiver passando por cima do elemento.
import React, { useRef } from 'react';
import { useHover } from 'react-use-utils';
const App: React.FC = () => {
const ref = useRef<HTMLDivElement>(null);
const isHovered = useHover(ref);
return (
<div>
<div ref={ref} style={{ width: 200, height: 200, background: isHovered ? 'red' : 'blue' }}>
Hover me
</div>
</div>
);
};useCounterTimer
useCounterTimer(delay?: number, duration?: number, delayFrame?: number): numberHook que retorna o tempo decorrido desde o início da contagem.
delay: Tempo de espera.duration: Duração da contagem.delayFrame: Quadro de atraso.return: Retorna o tempo decorrido.
import React from 'react';
import { useCounterTimer } from 'react-use-utils';
const App: React.FC = () => {
const elapsed = useCounterTimer(1000, 5000, 100);
return <div>Elapsed time: {elapsed}ms</div>;
};useBezierEasing
useBezierEasing(
easing:
| [number, number, number, number]
| [[number, number], [number, number]]
| "linear"
| "elastic"
| "ease"
| "ease-in"
| "ease-in-elastic"
| "ease-in-bounce"
| "ease-in-expo"
| "ease-in-sine"
| "ease-in-quad"
| "ease-in-cubic"
| "ease-in-back"
| "ease-in-quart"
| "ease-in-quint"
| "ease-in-circ"
| "ease-in-out"
| "ease-in-out-elastic"
| "ease-in-out-bounce"
| "ease-in-out-sine"
| "ease-in-out-quad"
| "ease-in-out-cubic"
| "ease-in-out-back"
| "ease-in-out-quart"
| "ease-in-out-quint"
| "ease-in-out-expo"
| "ease-in-out-circ"
| "ease-out"
| "ease-out-elastic"
| "ease-out-bounce"
| "ease-out-sine"
| "ease-out-quad"
| "ease-out-cubic"
| "ease-out-back"
| "ease-out-quart"
| "ease-out-quint"
| "ease-out-expo"
| "ease-out-circ"
| "fast-out-slow-in"
| "fast-out-linear-in"
| "linear-out-slow-in" = "linear",
delay: number,
duration: number,
delayFrame?: number
): anyHook que retorna um valor com base em uma função de easing.
easing: Função de easing.[number, number, number, number]: Curva de Bezier.[[number, number], [number, number]]: Curva de Bezier."linear": Linear."elastic": Elástico."ease": Suave."ease-in": Suave de entrada."ease-in-elastic": Suave de entrada elástica."ease-in-bounce": Suave de entrada de salto."ease-in-expo": Suave de entrada exponencial."ease-in-sine": Suave de entrada senoidal."ease-in-quad": Suave de entrada quadrática."ease-in-cubic": Suave de entrada cúbica."ease-in-back": Suave de entrada de volta."ease-in-quart": Suave de entrada quartica."ease-in-quint": Suave de entrada quintica."ease-in-circ": Suave de entrada circular."ease-in-out": Suave de entrada e saída."ease-in-out-elastic": Suave de entrada e saída elástica."ease-in-out-bounce": Suave de entrada e saída de salto."ease-in-out-sine": Suave de entrada e saída senoidal."ease-in-out-quad": Suave de entrada e saída quadrática."ease-in-out-cubic": Suave de entrada e saída cúbica."ease-in-out-back": Suave de entrada e saída de volta."ease-in-out-quart": Suave de entrada e saída quartica."ease-in-out-quint": Suave de entrada e saída quintica."ease-in-out-expo": Suave de entrada e saída exponencial."ease-in-out-circ": Suave de entrada e saída circular."ease-out": Suave de saída."ease-out-elastic": Suave de saída elástica."ease-out-bounce": Suave de saída de salto."ease-out-sine": Suave de saída senoidal."ease-out-quad": Suave de saída quadrática."ease-out-cubic": Suave de saída cúbica."ease-out-back": Suave de saída de volta."ease-out-quart": Suave de saída quartica."ease-out-quint": Suave de saída quintica."ease-out-expo": Suave de saída exponencial."ease-out-circ": Suave de saída circular."fast-out-slow-in": Rápido de saída lento de entrada."fast-out-linear-in": Rápido de saída linear de entrada."linear-out-slow-in": Linear de saída lento de entrada.
delay: Tempo de espera.duration: Duração.delayFrame: Quadro de atraso.return: Retorna um valor com base na função de easing.
import React from 'react';
import { useBezierEasing } from 'react-use-utils';
const App: React.FC = () => {
const value = useBezierEasing('ease-in-out', 100, 1000, 10);
return <div>Value: {value}</div>;
};useLocalStorage
useLocalStorage<T = any>(key: string, initialValue: T): [T, (value: T|(previous: T)=>T) => void]Hook que armazena um valor no localStorage.
key: Chave.initialValue: Valor inicial.return: Retorna um array com o valor e uma função para definir um novo valor.
import React from 'react';
import { useLocalStorage } from 'react-use-utils';
const App: React.FC = () => {
const [name, setName] = useLocalStorage('name', 'John Doe');
return (
<div>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
);
};useElementRect
useElementRect<T extends HTMLElement>(ref: React.RefObject<T>): {
width: number;
height: number;
bottom: number;
top: number;
left: number;
right: number;
x: number;
y: number;
}Hook que retorna as dimensões de um elemento.
ref: Referência do elemento.width: Largura.height: Altura.bottom: Distância do topo.top: Distância da base.left: Distância da esquerda.right: Distância da direita.x: Posição horizontal.y: Posição vertical.return: Retorna um objeto com as propriedadeswidth,height,bottom,top,left,right,xey.
import React, { useRef } from 'react';
import { useElementRect } from 'react-use-utils';
const App: React.FC = () => {
const ref = useRef<HTMLDivElement>(null);
const rect = useElementRect(ref);
return (
<div>
<div ref={ref} style={{ width: 200, height: 200, background: 'red' }}>
Element
</div>
<p>Width: {rect.width}</p>
<p>Height: {rect.height}</p>
</div>
);
};useFitText
useFitText<T extends HTMLElement, I extends HTMLElement>(
textRef: React.MutableRefObject<T | null>,
containerRef: React.MutableRefObject<I | null>,
minFontSize?: number,
maxFontSize?: number,
increment?: number
): voidHook que ajusta o tamanho do texto para caber no contêiner.
textRef: Referência do texto.containerRef: Referência do contêiner.minFontSize: Tamanho mínimo da fonte.maxFontSize: Tamanho máximo da fonte.increment: Incremento.return: Retornavoid.
import React, { useRef } from 'react';
import { useFitText } from 'react-use-utils';
const App: React.FC = () => {
const textRef = useRef<HTMLDivElement>(null);
const containerRef = useRef<HTMLDivElement>(null);
useFitText(textRef, containerRef, 12, 24, 1);
return (
<div>
<div ref={containerRef} style={{ width: 200, height: 200, background: 'red' }}>
<div ref={textRef}>Fit text</div>
</div>
</div>
);
};