ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

useQuery๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰์ด ์ž˜ ๋˜๋„๋ก ๊ตฌํ˜„ํ•ด๋‘” ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” input ์ฐฝ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ์„ ๊ณ„์† ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„๋งˆ๋‹ค ๋งค๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Œ

์˜ˆ๋ฅผ๋“ค์–ด "์ถ˜์‹" ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ์€๋ฐ ์‹ค์ œ ํ˜ธ์ถœ์€ "ใ…Š, ์ถ”, ์ถ˜, ์ถ˜ใ……, ์ถ˜์‹œ, ์ถ˜์‹" ์ด๋ ‡๊ฒŒ ๋งค~๋ฒˆ ๋‹ค ๊ฐ€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.๐Ÿ˜ฑ

๋ถˆํ•„์š”ํ•œ ํ˜ธ์ถœ์„ ์ค„์ด๊ณ  ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ํ๋ฅด๋ฉด ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋„๋ก ๋ฐ”๊พธ์–ด๋ณด์ž.

 

์—ฌ๊ธฐ์„œ ๋‚˜๋Š” debounce๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ ค๊ณ  ํ•œ๋‹ค!

 

์ฒ˜์Œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์—๋Š” ์ •๋ง ๊ฒ€์ƒ‰๋งŒ ๋˜๊ฒŒ ^^.. ์„ฑ๋Šฅ์ด๋‚˜ ์ตœ์ ํ™”๋Š” 1๋„ ๊ณ ๋ คํ•˜์ง€์•Š๊ณ  ์ •๋ง ๊ฒ€์ƒ‰๋งŒ ๋˜๋„๋ก ํ•˜๋А๋ผ 

๋””๋ฐ”์šด์Šค๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์•„์˜ˆ ๋ชฐ๋ž์—ˆ๋˜ ๋ฐ”๋ณด์˜€๋Š”ใ„ท...ใ…”....

์ด๋ฒˆ์— ๋Œ€์ถฉ ๋งŒ๋“ค์–ด๋‘” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ณ ์ณ๊ฐ€๋ฉด์„œ ๋””๋ฐ”์šด์Šค์— ๋Œ€ํ•ด ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

 

debouncing (๋””๋ฐ”์šด์‹ฑ) ์€ ์—ฐ์ด์–ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค ์ค‘์— ๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜ (or ๊ฐ€์žฅ ์ฒซ ํ•จ์ˆ˜) ๋งŒ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

 

์ปค์Šคํ…€ ํ›… ๋งŒ๋“ค๊ธฐ

์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด์„œ ์ ์šฉํ•ด๋ณด์ž.

import { useEffect, useState } from 'react';

function useDebounceValue(value, delay) {
  const [debouncedValue, setDebouncedValue] = useState(value); // input์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์„ state๋กœ ์ •์˜ํ•œ๋‹ค.

// ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์—๋„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด setDevounceValue ํ•จ์ˆ˜ ์‹คํ–‰
// ์ฆ‰, ์ตœ์ข… ์ž…๋ ฅ ๊ฐ’์ด state์— ๋“ค์–ด๊ฐ„๋‹ค.
// ๋ฐ”๋€ ์ตœ์ข… ๊ฐ’์ด return ๋œ๋‹ค.
// ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „์— ๋˜ input์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๊ธฐ์กด debounceValue๊ฐ€ return ๋œ๋‹ค.
  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

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

  return debouncedValue;
}

export default useDebounceValue;

 

์ฝ”๋“œ ์ˆ˜์ •

import React, { useState } from 'react';
import { useQuery } from 'react-query';
import getSearchUser from '../../api/search/getSearchUser';
import SearchTemplate from '../../components/template/SearchTemplate/SearchTemplate';
import useDebounceValue from '../../hooks/useDebounceValue';

const SearchPage = () => {
  const [keyword, setKeyword] = useState('');

  const debouncedKeyword = useDebounceValue(keyword, 500); // ํ‚ค์›Œ๋“œ ๊ฐ’, 0.5์ดˆ

  const { data, isLoading } = useQuery(
    ['searchUser', debouncedKeyword],
    () => getSearchUser(keyword),
    {
      enabled: !!debouncedKeyword,
      select: (result) =>
        result
          .filter((user) => user.username.includes(debouncedKeyword))
          .slice(0, 10),
    },
  );

  const onChangeSearch = (e) => {
    setKeyword(e.target.value);
  };

  return (
    <SearchTemplate
      onChangeSearch={onChangeSearch}
      searchResultData={data}
      keyword={keyword}
      isLoading={isLoading}
    />
  );
};

export default SearchPage;

 

๊ฒฐ๊ณผ

abc๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด 0.5์ดˆ ๋’ค ๊ฒ€์ƒ‰์–ด์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ๋„คํŠธ์›Œํฌ ํƒญ์—์„œ api๊ฐ€ ํ•œ๋ฒˆ๋งŒ ๋ถˆ๋Ÿฌ์™€์ง„ ๊ฒƒ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ณ ์น˜์ง€ ๋ชปํ•œ ์‚ฌํ•ญ

๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๊ฐ€ ์ง€์šฐ๋ฉด ์™œ ์ด๋ ‡๊ฒŒ ๋œจ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค ใ… ใ… 

๊ฒ€์ƒ‰์–ด๋ฅผ ์ง€์šด๋‹ค๋ฉด ์•„์˜ˆ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋œจ๊ธธ ๋ฐ”๋ผ๋Š”๋ฐ ์ž๊พธ ์ €๋ ‡๊ฒŒ ๋œฌ๋‹ค ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์•„์•„์•„์•„์•…....

ํ•œ๋‹ฌ๋ฐ˜๋งŒ์— ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ด ๋ชปํ•˜๊ณ  ์žˆ๋‚˜ ์‹ถ๊ธฐ๋„ ํ•˜๊ณ ,, ^^ใ… ใ… 

 

+) 2023.02.28 ์ˆ˜์ • ์™„๋ฃŒ!

๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์˜€๋‹ค..ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ์—๋งŒ ์œ ์ € ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œจ๊ฒŒ๋” ํ•˜๋ฉด ๋˜์ž–์•„...!!!!!!

keyword && ์ถ”๊ฐ€ํ•œ๊ฒŒ ๋...................................................^^

๋Œ“๊ธ€