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

web/react hook

useTransition

dev_been94 2024. 12. 14. 15:51
728x90
๋ฐ˜์‘ํ˜•

useTransition

 

๐ŸŽฏ useTransition์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

**useTransition**์€ **"์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜(๋ฒ„ํŠผ ํด๋ฆญ, ์ž…๋ ฅ ๋“ฑ)๊ณผ ๋ฌด๊ฑฐ์šด ์ž‘์—…(ํ™”๋ฉด ๋ Œ๋”๋ง)์„ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„๊ตฌ"**์˜ˆ์š”.

์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด:

  • ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋™์ž‘(์˜ˆ: ๊ฒ€์ƒ‰, ๋ฒ„ํŠผ ํด๋ฆญ)์„ ํ–ˆ์„ ๋•Œ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š” ๋ถ€๋ถ„๊ณผ
  • ๊ทธ ๋™์ž‘ ์ดํ›„์— ํ™”๋ฉด์„ ์ฒœ์ฒœํžˆ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋‚˜๋ˆ„์–ด์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŒ ์™œ useTransition์ด ํ•„์š”ํ• ๊นŒ์š”?

์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ๊ฒ€์ƒ‰์ฐฝ์— ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์žˆ์–ด์š”. ๐Ÿ”
์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์— ๊ฒฐ๊ณผ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ข‹๊ฒ ์ฃ ? ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๋งŽ์•„์„œ ํ™”๋ฉด์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๊ฑฐ๋‚˜ ๋Š๋ ค์ง„๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋ถˆํŽธํ•ด์งˆ ๊ฑฐ์˜ˆ์š”.

useTransition์„ ์‚ฌ์šฉํ•˜๋ฉด:

  1. ์ž…๋ ฅ์ด๋‚˜ ํด๋ฆญ๊ณผ ๊ฐ™์€ ๋™์ž‘์€ ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๊ณ ,
  2. ํ™”๋ฉด์— ๋ณต์žกํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ž‘์—…์€ "์กฐ๊ธˆ ๋‚˜์ค‘์—" ์—ฌ์œ  ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ›จ์”ฌ ๋ถ€๋“œ๋Ÿฌ์›Œ์ ธ์š”! ๐ŸŽ‰

 

๐Ÿ› ๏ธ useTransition ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰์ฐฝ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด useTransition์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

 

1. useTransition ์ฝ”๋“œ ์˜ˆ์ œ

import React, { useState, useTransition } from "react";

function SearchList() {
  const [input, setInput] = useState(""); // ์ž…๋ ฅ๊ฐ’ ์ƒํƒœ
  const [searchResults, setSearchResults] = useState([]); // ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ƒํƒœ
  const [isPending, startTransition] = useTransition(); // useTransition ์‚ฌ์šฉ

  const handleSearch = (e) => {
    const value = e.target.value;
    setInput(value);

    // ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ๋‚˜์ค‘์œผ๋กœ ๋ฏธ๋ฃจ๊ธฐ
    startTransition(() => {
      const results = [];
      for (let i = 0; i < 10000; i++) {
        results.push(`๊ฒฐ๊ณผ ${value} - ${i}`);
      }
      setSearchResults(results); // ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธ
    });
  };

  return (
    <div>
      <h3>useTransition ์˜ˆ์ œ</h3>
      <input
        type="text"
        placeholder="๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”"
        value={input}
        onChange={handleSearch}
      />
      {isPending && <p>๊ฒฐ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...</p>} {/* ์ง„ํ–‰ ์ค‘ ํ‘œ์‹œ */}
      <ul>
        {searchResults.map((result, index) => (
          <li key={index}>{result}</li>
        ))}
      </ul>
    </div>
  );
}

export default SearchList;

 

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. useTransition์œผ๋กœ ์ƒํƒœ ๋‚˜๋ˆ„๊ธฐ
const [isPending, startTransition] = useTransition();

 

  • isPending: ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฐ’์ด์—์š”.
  • startTransition: ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ์—ฌ์œ ๋กญ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

2. startTransition ์‚ฌ์šฉ

startTransition(() => {
  const results = [];
  for (let i = 0; i < 10000; i++) {
    results.push(`๊ฒฐ๊ณผ ${value} - ${i}`);
  }
  setSearchResults(results);
});

 

 

  • ์ž…๋ ฅ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด startTransition ์•ˆ์—์„œ **๋ฌด๊ฑฐ์šด ์ž‘์—…(๋Œ€๋Ÿ‰์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ƒ์„ฑ)**์„ ์ฒ˜๋ฆฌํ•ด์š”.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž…๋ ฅ๊ฐ’์€ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๊ณ , ํ™”๋ฉด ๋ Œ๋”๋ง์€ ์กฐ๊ธˆ ์—ฌ์œ  ์žˆ๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

3. isPending๋กœ ๋กœ๋”ฉ ํ‘œ์‹œ

  • isPending ๊ฐ’์ด true์ผ ๋•Œ๋Š” **"๊ฒฐ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘..."**๊ณผ ๊ฐ™์€ ๋กœ๋”ฉ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

 

โšก useTransition์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ 

  1. ์ž…๋ ฅ์ด๋‚˜ ํด๋ฆญ์€ ์ฆ‰๊ฐ ๋ฐ˜์‘
    • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ํ™”๋ฉด์— ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  2. ๋ณต์žกํ•œ ์ž‘์—…์€ ์—ฌ์œ ๋กญ๊ฒŒ ์ฒ˜๋ฆฌ
    • ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ์ด๋‚˜ ๋ Œ๋”๋ง ์ž‘์—…์€ ๋‹ค๋ฅธ ์ž‘์—…์ด ๋๋‚œ ํ›„์— ์ฒ˜๋ฆฌ๋˜๋‹ˆ๊นŒ ํ™”๋ฉด์ด ๋ฒ„๋ฒ…์ด์ง€ ์•Š์•„์š”.
  3. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ํ–ฅ์ƒ
    • ๋Š๋ฆฐ ์ž‘์—… ๋•Œ๋ฌธ์— ์ž…๋ ฅ์ด ์ง€์—ฐ๋˜์ง€ ์•Š๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿงฉ useTransition์„ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ: ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ ํ™”๋ฉด์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ.
  • ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์•ผ ํ•  ๋•Œ.
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๋ณต์žกํ•œ ์ž‘์—…์ด ๋™์‹œ์— ์ผ์–ด๋‚  ๋•Œ: ์ž…๋ ฅ์€ ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜๋˜, ๋ Œ๋”๋ง์€ ๋‚˜์ค‘์— ์ฒœ์ฒœํžˆ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

 

๐ŸŒŸ ์ •๋ฆฌํ•˜์ž๋ฉด!

useTransition์€ ์‚ฌ์šฉ์ž์˜ ๋น ๋ฅธ ๋™์ž‘(์ž…๋ ฅ, ํด๋ฆญ ๋“ฑ)๊ณผ ๋ฌด๊ฑฐ์šด ์ž‘์—…(ํ™”๋ฉด ๋ Œ๋”๋ง)์„ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ›…์ด์—์š”.
์‚ฌ์šฉ์ž ์ž…๋ ฅ์€ ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๊ณ , ๋ณต์žกํ•œ ๋ Œ๋”๋ง์€ ์กฐ๊ธˆ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•ด์„œ ํ™”๋ฉด์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ๐Ÿš€

 

728x90
๋ฐ˜์‘ํ˜•

'web > react hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

useSyncExternalStore  (1) 2024.12.14
useState  (0) 2024.12.14
useRef  (0) 2024.12.14
useReducer  (0) 2024.12.14
useOptimistic  (0) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250