2024-04-12.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 6์ฃผ์ฐจ-5

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week6-5_2024-04-12

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ---------- | --------------------------------------------------------- | ----------- | | 6์ฃผ์ฐจ | 10์žฅ, 11์žฅ | ๋ฆฌ์•กํŠธ 17๊ณผ 18 ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์‚ดํŽด๋ณด๊ธฐ, Next.js 13๊ณผ ๋ฆฌ์•กํŠธ 18 | 686~693p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
๊ธˆ์š”์ผ ์™ธ์ถœ ์ด์Šˆ๋กœ -> ๋ฒ„์Šค์—์„œ ์ฝ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ธ ๋‚ด์šฉ์€ ํ† ์š”์ผ์— ์ •๋ฆฌ ์˜ˆ์ •!


๋ฆฌ์•กํŠธ ํ›… ์•Œ์•„๋ณด๊ธฐ

  • useDeferredValue

    • useTransition๊ณผ useDeferredValue: ๋žœ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒ

      • useTransition: ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ฝ”๋“œ์— ์ ‘๊ทผ
      • useDeferredValue: ๊ฐ’์—๋งŒ ์ ‘๊ทผ ex) props
      export default function Input() {
        const [text, setText] = useState(""); // ์žฆ์€ ๋ณ€๊ฒฝ
        const deferredText = useDeferredValue(text); // ๊ธ‰ํ•˜์ง€ ์•Š์Œ
      
        const list = useMemo(() => {
          const arr = Array.from({ length: deferredText.length }).map(
            (_) => deferredText
          );
      
          return (
            <ul>
              {arr.map((str, index) => (
                <li key={index}>{str}</li>
              ))}
            </ul>
          );
        }, [deferredText]); // deferredText๋ฅผ ์˜์กดํ•˜๋Š” list ๋ฉ”๋ชจ์ด์ œ์ด์…˜
      
        function handleChange(e: ChangeEvent<HTMLInputElement>) {
          setText(e.target.value);
        }
      
        return <><input value={text} onChange={handleChange}>{list}</input>;
      }
      
  • useSyncExternalStore

    • ๊ตฌ๋… ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„, ์ตœ์‹  ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ๋ณด์žฅ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง ํ˜ธํ™˜์„ฑ

      import { useSyncExternalStore } from "react";
      
      function subscribe(callback: (this: Window, ev: UIEvent) => void) {
        window.addEventListener("resize", callback);
        return () => {
          window.removeEventListener("resize", callback);
        };
      }
      
      function useWindowWidth() {
        return useSyncExternalStore(
          subscribe,
          () => window.innerWidth,
          () => 0 // ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์‹œ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’
        );
      }
      
      export default function App() {
        const windowSize = useWindowWidth();
        return (
          <>
            {windowSize} {window.innerWidth}
          </>
        );
      }
      
  • useInsertionEffect

    • CSS-in-js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • styled-components๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ€์ผ์„ ๋ชจ์•„์„œ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง ์ด์ „์— <style> ํƒœ๊ทธ์— ์‚ฝ์ž…ํ•˜๋Š” ์ž‘์—…์€ ๋ชจ๋“  ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋žœ๋”๋ง์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜๋„ ์žˆ๋Š” ๋งค์šฐ ๋ฌด๊ฑฐ์šด ์ž‘์—…
    • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์Šคํƒ€์ผ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์„ ํ›…์—์„œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ. - DOM์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์— ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ - ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. | ํ›… | ์‹คํ–‰ ์‹œ์  | | --- | --- | | useLayoutEffect | DOM ๋ณ€๊ฒฝ ์ž‘์—…์ด ๋๋‚œ ์ดํ›„์— ์‹คํ–‰ | | useInsertionEffect | DOM ๋ณ€๊ฒฝ ์ž‘์—… ์ด์ „์— ์‹คํ–‰๋œ๋‹ค | | useEffect | ์ปดํฌ๋„ŒํŠธ Commit ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค |
  • ๋ฆฌ์•กํŠธ 18์—์„œ ๋™์‹œ์„ฑ ๋žœ๋”๋ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋™์‹œ์„ฑ ์ง€์›์„ ํ•˜๋Š”์ง€ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.