REACT_LIB Telegram 697
πŸ”₯9 ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ…ΡƒΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пригодятся ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΌΡƒ React-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ для управлСния состояниСм, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²


1. useDebounce

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ "ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ" Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Π²Π²ΠΎΠ΄Π°/поиска.


import { useEffect, useState } from 'react';

export function useDebounce<T>(value: T, delay = 300): T {
const [debounced, setDebounced] = useState(value);

useEffect(() => {
const timer = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);

return debounced;
}



2. usePrevious

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΏΠ° ΠΈΠ»ΠΈ стСйта.


import { useRef, useEffect } from 'react';

export function usePrevious<T>(value: T): T | undefined {
const ref = useRef<T>();
useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
}



3. useOnClickOutside

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠΎΠ΄Π°Π»ΠΎΠΊ, Π΄Ρ€ΠΎΠΏΠ΄Π°ΡƒΠ½ΠΎΠ² ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π²Π½Π΅.


import { useEffect } from 'react';

export function useOnClickOutside(ref: React.RefObject<HTMLElement>, handler: () => void) {
useEffect(() => {
const listener = (e: MouseEvent) => {
if (!ref.current || ref.current.contains(e.target as Node)) return;
handler();
};
document.addEventListener('mousedown', listener);
return () => document.removeEventListener('mousedown', listener);
}, [ref, handler]);
}



4. useIsMounted

ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ обновлСния состояния послС размонтирования.


import { useEffect, useRef } from 'react';

export function useIsMounted() {
const ref = useRef(false);
useEffect(() => {
ref.current = true;
return () => { ref.current = false; };
}, []);
return ref;
}



5. useEventCallback

Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ колбэка Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€Π°.


import { useRef, useCallback } from 'react';

export function useEventCallback<T extends (...args: any[]) => any>(fn: T): T {
const ref = useRef(fn);
ref.current = fn;
return useCallback((...args: any[]) => ref.current(...args), []) as T;
}



6. useAsync

Асинхронный Π²Ρ‹Π·ΠΎΠ² с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ошибок ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.


import { useState, useCallback } from 'react';

export function useAsync<T>(asyncFn: () => Promise<T>) {
const [loading, setLoading] = useState(false);
const [data, setData] = useState<T | null>(null);
const [error, setError] = useState<unknown>(null);

const run = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await asyncFn();
setData(result);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
}, [asyncFn]);

return { loading, data, error, run };
}



7. useLocalStorage

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ…ΡƒΠΊ для хранСния Π΄Π°Π½Π½Ρ‹Ρ… Π² localStorage.


import { useState, useEffect } from 'react';

export function useLocalStorage<T>(key: string, initial: T) {
const [value, setValue] = useState<T>(() => {
const json = localStorage.getItem(key);
return json ? JSON.parse(json) : initial;
});

useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);

return [value, setValue] as const;
}



8. useMediaQuery

Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ΅Π΄ΠΈΠ°-запросами Π² React Π±Π΅Π· CSS.


import { useEffect, useState } from 'react';

export function useMediaQuery(query: string): boolean {
const [matches, setMatches] = useState(() => window.matchMedia(query).matches);

useEffect(() => {
const media = window.matchMedia(query);
const listener = () => setMatches(media.matches);
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
}, [query]);

return matches;
}



9. useToggle

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ состояния (on/off).


import { useCallback, useState } from 'react';

export function useToggle(initial = false) {
const [state, setState] = useState(initial);
const toggle = useCallback(() => setState(prev => !prev), []);
return [state, toggle] as const;
}


✍️ @React_lib
πŸ‘10❀1



tgoop.com/React_lib/697
Create:
Last Update:

πŸ”₯9 ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ…ΡƒΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пригодятся ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΌΡƒ React-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ для управлСния состояниСм, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²


1. useDebounce

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ "ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ" Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Π²Π²ΠΎΠ΄Π°/поиска.


import { useEffect, useState } from 'react';

export function useDebounce<T>(value: T, delay = 300): T {
const [debounced, setDebounced] = useState(value);

useEffect(() => {
const timer = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);

return debounced;
}



2. usePrevious

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΏΠ° ΠΈΠ»ΠΈ стСйта.


import { useRef, useEffect } from 'react';

export function usePrevious<T>(value: T): T | undefined {
const ref = useRef<T>();
useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
}



3. useOnClickOutside

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠΎΠ΄Π°Π»ΠΎΠΊ, Π΄Ρ€ΠΎΠΏΠ΄Π°ΡƒΠ½ΠΎΠ² ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π²Π½Π΅.


import { useEffect } from 'react';

export function useOnClickOutside(ref: React.RefObject<HTMLElement>, handler: () => void) {
useEffect(() => {
const listener = (e: MouseEvent) => {
if (!ref.current || ref.current.contains(e.target as Node)) return;
handler();
};
document.addEventListener('mousedown', listener);
return () => document.removeEventListener('mousedown', listener);
}, [ref, handler]);
}



4. useIsMounted

ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ обновлСния состояния послС размонтирования.


import { useEffect, useRef } from 'react';

export function useIsMounted() {
const ref = useRef(false);
useEffect(() => {
ref.current = true;
return () => { ref.current = false; };
}, []);
return ref;
}



5. useEventCallback

Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ колбэка Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€Π°.


import { useRef, useCallback } from 'react';

export function useEventCallback<T extends (...args: any[]) => any>(fn: T): T {
const ref = useRef(fn);
ref.current = fn;
return useCallback((...args: any[]) => ref.current(...args), []) as T;
}



6. useAsync

Асинхронный Π²Ρ‹Π·ΠΎΠ² с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ошибок ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.


import { useState, useCallback } from 'react';

export function useAsync<T>(asyncFn: () => Promise<T>) {
const [loading, setLoading] = useState(false);
const [data, setData] = useState<T | null>(null);
const [error, setError] = useState<unknown>(null);

const run = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await asyncFn();
setData(result);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
}, [asyncFn]);

return { loading, data, error, run };
}



7. useLocalStorage

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ…ΡƒΠΊ для хранСния Π΄Π°Π½Π½Ρ‹Ρ… Π² localStorage.


import { useState, useEffect } from 'react';

export function useLocalStorage<T>(key: string, initial: T) {
const [value, setValue] = useState<T>(() => {
const json = localStorage.getItem(key);
return json ? JSON.parse(json) : initial;
});

useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);

return [value, setValue] as const;
}



8. useMediaQuery

Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ΅Π΄ΠΈΠ°-запросами Π² React Π±Π΅Π· CSS.


import { useEffect, useState } from 'react';

export function useMediaQuery(query: string): boolean {
const [matches, setMatches] = useState(() => window.matchMedia(query).matches);

useEffect(() => {
const media = window.matchMedia(query);
const listener = () => setMatches(media.matches);
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
}, [query]);

return matches;
}



9. useToggle

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ состояния (on/off).


import { useCallback, useState } from 'react';

export function useToggle(initial = false) {
const [state, setState] = useState(initial);
const toggle = useCallback(() => setState(prev => !prev), []);
return [state, toggle] as const;
}


✍️ @React_lib

BY React


Share with your friend now:
tgoop.com/React_lib/697

View MORE
Open in Telegram


Telegram News

Date: |

How to Create a Private or Public Channel on Telegram? Users are more open to new information on workdays rather than weekends. Select β€œNew Channel” Avoid compound hashtags that consist of several words. If you have a hashtag like #marketingnewsinusa, split it into smaller hashtags: β€œ#marketing, #news, #usa. Telegram users themselves will be able to flag and report potentially false content.
from us


Telegram React
FROM American