5 قلاب سفارشی برتر برای React

سلام به همه Slao است ،
موارد زیر 5 قلاب برتر مناسب و جدید برای همه خواهد بود که همه بتوانند از آن استفاده کنند
usemediaquery
Usemediaquery به نمایش داده های رسانه ای گوش می دهد و به شما امکان می دهد انواع یا رفتارهای خاصی را بر اساس اندازه تجهیزات اعمال کنید
import { useEffect, useState } from 'react';
function useMediaQuery(query) {
const [matches, setMatches] = useState(false);
useEffect(() => {
const mediaQuery = window.matchMedia(query);
setMatches(mediaQuery.matches);
const handler = event => setMatches(event.matches);
mediaQuery.addEventListener('change', handler);
return () => mediaQuery.removeEventListener('change', handler);
}, [query]);
return matches;
}
استفاده کردن
const isLargeScreen = useMediaQuery('(min-width: 1024px)');
استفاده
HOOK CEASEWEBECKETE برنامه شما را به سرور WebSocket متصل می کند و به راحتی داده های زمان واقعی را ارسال و دریافت می کند. این اتصالات ، بافر پیام و رسیدگی به رویدادها را پردازش می کند و به روزرسانی آن آسان است
این مثال یک Webocket Hook را ارائه می دهد که می تواند با مدیریت اتصال ، پردازش رویدادها و ویژگی های تمیز کننده به طور مرتب مورد استفاده قرار گیرد.
import { useState, useEffect, useRef, useCallback } from 'react';
function useWebSocket(url, options = {}) {
const { reconnect = true, reconnectInterval = 5000, onOpen, onMessage, onError, onClose } = options;
const [isConnected, setIsConnected] = useState(false);
const [lastMessage, setLastMessage] = useState(null);
const websocketRef = useRef(null);
const reconnectTimeout = useRef(null);
const connect = useCallback(() => {
websocketRef.current = new WebSocket(url);
websocketRef.current.onopen = (event) => {
setIsConnected(true);
onOpen && onOpen(event);
};
websocketRef.current.onmessage = (event) => {
setLastMessage(event.data);
onMessage && onMessage(event);
};
websocketRef.current.onerror = (event) => {
onError && onError(event);
};
websocketRef.current.onclose = (event) => {
setIsConnected(false);
onClose && onClose(event);
if (reconnect) {
reconnectTimeout.current = setTimeout(connect, reconnectInterval);
}
};
}, [url, reconnect, reconnectInterval, onOpen, onMessage, onError, onClose]);
const sendMessage = useCallback((message) => {
if (isConnected && websocketRef.current) {
websocketRef.current.send(message);
}
}, [isConnected]);
useEffect(() => {
connect();
return () => {
if (websocketRef.current) {
websocketRef.current.close();
}
clearTimeout(reconnectTimeout.current);
};
}, [connect]);
return { isConnected, sendMessage, lastMessage };
}
ویژگی های UseWebocket
- انتقال مجدد: اگر اتصال بسته شود ، پس از مدت زمان مشخصی به طور خودکار دوباره وصل می شود
- رسیدگی به رویداد: ویژگی هایی را برای تماس با Onopen ، OnMessage ، OnError و Onclose قبول کنید تا در صورت لزوم رسیدگی کنید
- ارسال پیام: انرژی SendMessage را فراهم می کند که فقط هنگام باز شدن WebSocket پیام را ارسال می کند
- آخرین ذخیره پیام: آخرین داده های دریافت شده را ذخیره کنید ، نزدیکترین داده ها را بدون ثبت نام بپذیرید.
استفاده کردن
function ChatApp() {
const { isConnected, sendMessage, lastMessage } = useWebSocket('ws://localhost:4000/chat', {
reconnect: true,
reconnectInterval: 3000,
onOpen: () => console.log('Connected to WebSocket'),
onMessage: (event) => console.log('New message received:', event.data),
onClose: () => console.log('Disconnected from WebSocket'),
});
const [inputValue, setInputValue] = useState('');
const handleSend = () => {
sendMessage(inputValue);
setInputValue('');
};
return (
);
}
ارباب
شناسایی ماوس از طریق یک عنصر برای رسیدگی به ابزارها ، انیمیشن ها یا هر بازخورد UI در مورد ماوس
import { useState, useRef, useEffect } from 'react';
function useHover() {
const [hovered, setHovered] = useState(false);
const ref = useRef(null);
useEffect(() => {
const handleMouseOver = () => setHovered(true);
const handleMouseOut = () => setHovered(false);
const node = ref.current;
if (node) {
node.addEventListener('mouseover', handleMouseOver);
node.addEventListener('mouseout', handleMouseOut);
}
return () => {
if (node) {
node.removeEventListener('mouseover', handleMouseOver);
node.removeEventListener('mouseout', handleMouseOut);
}
};
}, [ref]);
return [ref, hovered];
}
const [hoverRef, isHovered] = useHover();
در حالی که در Debounce
جلوگیری از فعال شدن سریع وقایع ، استفاده شده ممکن است برای زمینه های ورودی یا میله های جستجو مفید باشد
import { useState, useEffect } from 'react';
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => clearTimeout(handler);
}, [value, delay]);
return debouncedValue;
}
const debouncedSearchTerm = useDebounce(searchTerm, 500);
useInfinitesCroll
Hook UseInfinitesCroll برای یافتن داده ها هنگام پایین آمدن کاربران بسیار مفید است. این می تواند برکاتی مانند بارگیری ، رسیدگی به خطا ، صفحه بندی را تحمل کند …
import { useState, useEffect, useRef, useCallback } from 'react';
function useInfiniteScroll(fetchData, options = {}) {
const { threshold = 0.8, hasMore = true } = options;
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const observerRef = useRef();
const loadMore = useCallback(async () => {
if (loading || !hasMore) return;
setLoading(true);
setError(null);
try {
const newData = await fetchData();
setData((prevData) => [...prevData, ...newData]);
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
}, [fetchData, loading, hasMore]);
useEffect(() => {
if (!hasMore) return;
const observer = new IntersectionObserver(
(entries) => {
if (entries[0].isIntersecting) {
loadMore();
}
},
{ threshold }
);
if (observerRef.current) observer.observe(observerRef.current);
return () => {
if (observerRef.current) observer.unobserve(observerRef.current);
};
}, [loadMore, hasMore, threshold]);
return { data, loading, error, observerRef };
}
function InfiniteScrollList() {
const fetchMoreData = async () => {
const response = await fetch('/api/data'); // Example API
return response.json();
};
const { data, loading, error, observerRef } = useInfiniteScroll(fetchMoreData, {
threshold: 0.9,
hasMore: true
});
return (
{data.map((item, index) => (
{item}
))}
{loading && Loading...
}
{error && Error loading data...
}
);
}