برنامه نویسی

بهترین واکنش قلاب سفارشی

وقتی به React فکر می کنیم اولین چیزی که به ذهنمان می رسد قلاب ها هستند، تا چه اندازه می توانند به ما در پیاده سازی ویژگی ها و حل مشکلاتی که همه از قبل می دانند کمک کنند، بنابراین هدف مقاله به اشتراک گذاشتن چند قلاب سفارشی است که در توسعه مفید بوده اند. برنامه های من و می تواند به شما در حل برخی از مشکلات خاص کمک کند، از ایجاد پیچیدگی های غیر ضروری جلوگیری کنید.

اما قبل از اینکه به سراغ خود هوک‌های سفارشی برویم، اگر با قلاب‌های واکنشی کاملاً راحت نیستید، من همچنان این ویدیو را پیشنهاد می‌کنم تا به سرعت به شما یادآوری کنم که هر کدام چگونه کار می‌کنند.

https://www.youtube.com/watch?v=TNhaISOUy6Q

بدون هیچ مقدمه ای دست به کار شویم!!

قلاب های سفارشی

1 استفاده از MediaQuery

احتمالاً با موقعیتی برخورد کرده اید که در آن لازم بود رفتارهای مختلفی بسته به اندازه صفحه وجود داشته باشد، برای مثال یک نوار ناوبری بالای 768 پیکسل و زیر آن نقطه شکست یک دکمه برای رندر یک نوار کناری جمع شونده، اجازه دهید به جزئیات در هوک برویم.

import { useEffect, useState } from 'react'

function useMediaQuery(query: string): boolean {
  const getMatches = (query: string): boolean => {
    // Previne problemas com SSR
    if (typeof window !== 'undefined') {
      return window.matchMedia(query).matches
    }
    return false
  }

   //State para verificar se passou ou não do breakpoint
  const [matches, setMatches] = useState<boolean>(getMatches(query))

  function handleChange() {
    setMatches(getMatches(query))
  }

  useEffect(() => {
    const matchMedia = window.matchMedia(query)

    handleChange()

    if (matchMedia.addListener) {
      matchMedia.addListener(handleChange)
    } else {
      matchMedia.addEventListener('change', handleChange)
    }

    return () => {
      if (matchMedia.removeListener) {
        matchMedia.removeListener(handleChange)
      } else {
        matchMedia.removeEventListener('change', handleChange)
      }
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [query])

  return matches
}

export default useMediaQuery
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نحوه استفاده

import { useMediaQuery } from 'usehooks-ts'

export default function Component() {
  const matches = useMediaQuery('(min-width: 768px)')

  return (
    <div>
      {`A viewport é ${matches ? 'no mínimo' : 'menor que'} 768 pixels wide`}
    </div>
  )
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


2 از Debounce استفاده کنید

برای کسانی که هنوز با الگوی Debounce آشنا نیستند، این شامل یک استراتژی برای کاهش درخواست های ارسالی از یک ورودی است که به طور گسترده در یک فیلد جستجو استفاده می شود، به عنوان مثال، مانع از بارگذاری بیش از حد بک اند یا در صورت عمومی می شود. api که از تعداد تماس ها در روز بیشتر است، بیایید به جزئیات در هوک برویم

import { useEffect, useState } from 'react'

//O value é valor que está mudando e chamando a api
function useDebounce<T>(value: T, delay?: number): T {
  const [debouncedValue, setDebouncedValue] = useState<T>(value)

  useEffect(() => {
    // Esse delay é o delay entre as chamadas para a api
    const timer = setTimeout(() => setDebouncedValue(value), delay || 500)

    return () => {
      clearTimeout(timer)
    }
  }, [value, delay])

  return debouncedValue
}

export default useDebounce
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این قلاب سفارشی به دلیل سادگی اجرای یک الگو و مزایای آن در یک برنامه مورد علاقه من است.

نحوه استفاده

import { ChangeEvent, useEffect, useState } from 'react'

import { useDebounce } from 'usehooks-ts'

export default function Component() {
  const [value, setValue] = useState<string>('')
  const debouncedValue = useDebounce<string>(value, 500)

  const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
    setValue(event.target.value)
  }

  useEffect(() => {
    // Faz o seu fetch ou a logica aqui
    // Ativa quando o "debouncedValue" mudar
  }, [debouncedValue])

  return (
    <div>
      <p>Valor em tempo real: {value}</p>
      <p>Valor do debounce: {debouncedValue}</p>

      <input type="text" value={value} onChange={handleChange} />
    </div>
  )
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


3 استفاده ازClickOutside

شانس ساخت یک مودال در هنگام کار با یک برنامه فرانت اند بسیار زیاد است، برخی از برنامه ها چندین مدال مختلف دارند و در همه آنها ما زمان قابل توجهی را صرف می کنیم تا آن را تا حد امکان دقیق، در دسترس و کارآمد کنیم.

با این قلاب موفق شدیم قابلیت بستن مدال هنگام کلیک کردن در خارج از آن را به روشی ساده و سریع پیاده سازی کنیم، بیایید آن را پیاده سازی کنیم.

import { useEffect, useRef } from 'react';

export const useClickOutside = (SetStateHandler: () => void) => {
  const domNode = useRef<HTMLDivElement>(null);
  useEffect(() => {
    let handler = (event: MouseEvent) => {
      if (!domNode.current?.contains(event.target as Node)) {
        SetStateHandler();
      }
    };
    document.addEventListener('mousedown', handler);

    return () => {
      document.removeEventListener('mousedown', handler);
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);
  return domNode;
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نحوه استفاده

import { useRef } from 'react'

import { useOnClickOutside } from 'usehooks-ts'

export default function Component() {
  const ref = useRef(null)

  const handleClickOutside = () => {
    // Sua logica customizada aqui
    console.log('clicked outside')
  }

  const handleClickInside = () => {
    // Sua logica customizada aqui
    console.log('clicked inside')
  }

  useOnClickOutside(ref, handleClickOutside)

  return (
    <button
      ref={ref}
      onClick={handleClickInside}
      style={{ width: 200, height: 200, background: 'cyan' }}
    />
  )
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


4 استفاده ازLocalStorage

در بسیاری از برنامه ها شما نیاز دارید که اطلاعاتی مانند تم، زبان و سایر تنظیمات برگزیده کاربر را در localStorage ذخیره کنید، بنابراین در نهایت یک منطق پیچیده ایجاد می کنید تا بررسی کنید که آیا عنصر در localStorage وجود دارد یا خیر، بنابراین این قلاب با هدف ساده سازی توسعه داده شده است. ادغام با این api مرورگر

پروژه معروفی که از این قلاب برای مدیریت اطلاعات کاربر استفاده می کند، Phived Phived است

import { useState } from 'react';

export function useLocalStorage<T>(key: string, initialValue: T) {
  const [storedValue, setStoredValue] = useState<T>(() => {
    if (typeof window === 'undefined') {
      return initialValue;
    }
    try {
      const item = localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      console.log(error);
      return initialValue;
    }
  });

  const setValue = (value: T | ((val: T) => T)) => {
    try {
      const valueToStore =
        value instanceof Function ? value(storedValue) : value;
      setStoredValue(valueToStore);
      if (typeof window !== 'undefined') {
        window.localStorage.setItem(key, JSON.stringify(valueToStore));
      }
    } catch (error) {
      console.log(error);
    }
  };

  return [storedValue, setValue] as const;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نحوه استفاده

import { useLocalStorage } from 'usehooks-ts'

export default function Component() {
  const [isDarkTheme, setDarkTheme] = useLocalStorage('darkTheme', true)

  const toggleTheme = () => {
    setDarkTheme((prevValue: boolean) => !prevValue)
  }

  return (
    <button onClick={toggleTheme}>
      {`The current theme is ${isDarkTheme ? `dark` : `light`}`}
    </button>
  )
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


5 استفاده ازHover

آیا تا به حال سعی کرده اید با hover انیمیشن های جالب بسازید؟ هر زمان که ماوس را روی یک شی قرار می دهید، منطقی اتفاق بیفتد؟ به محض وجود این قلاب، اجرای کارها را ساده کنید

function useHover() {
  const [value, setValue] = useState(false);
  const ref = useRef(null);
  const handleMouseOver = () => setValue(true);
  const handleMouseOut = () => setValue(false);
  useEffect(
    () => {
      const node = ref.current;
      if (node) {
        node.addEventListener("mouseover", handleMouseOver);
        node.addEventListener("mouseout", handleMouseOut);
        return () => {
          node.removeEventListener("mouseover", handleMouseOver);
          node.removeEventListener("mouseout", handleMouseOut);
        };
      }
    },
    [ref.current] // Chama de novo se o ref mudar
  );
  return [ref, value];
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نحوه استفاده

import { useRef } from 'react'

import { useHover } from 'usehooks-ts'

export default function Component() {
  const hoverRef = useRef(null)
  const isHover = useHover(hoverRef)

  return (
    <div ref={hoverRef}>
      {`The current div is ${isHover ? `hovered` : `unhovered`}`}
    </div>
  )
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


نتیجه

تعداد زیادی قلاب سفارشی در واکنش به حل بسیاری از مشکلات مختلف وجود دارد، با این حال، مهمتر از دانستن بسیاری از آنها دانستن زمان مناسب برای پیوست کردن کدهای بیشتر به پروژه خود است، قبل از استفاده از یک سفارشی از نیاز به استفاده از برخی ویژگی ها مطمئن شوید. قلاب کنید و با اعتدال استفاده کنید.

ممنون که تا اینجا خوندید، امیدوارم تا حدودی کمکتون کرده باشم، اگه دوست داشتید لایک کنید!

منابع

https://usehooks-ts.com

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا