Skip to content

Latest commit

ย 

History

History
93 lines (67 loc) ยท 3.76 KB

File metadata and controls

93 lines (67 loc) ยท 3.76 KB
title set-state-in-effect

Effect์—์„œ setState๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์žฌ๋ Œ๋”๋ง์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทœ์น™ ์„ธ๋ถ€ ์‚ฌํ•ญ {/rule-details/}

Effect ๋‚ด๋ถ€์—์„œ ์ฆ‰์‹œ state๋ฅผ ์„ค์ •ํ•˜๋ฉด React๊ฐ€ ์ „์ฒด ๋ Œ๋”๋ง ์‚ฌ์ดํด์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Effect์—์„œ state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด React๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ณ , DOM์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ๋‹ค์Œ, Effect๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ Œ๋”๋ง ์ค‘์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ props์—์„œ state๋ฅผ ํŒŒ์ƒ์‹œ์ผœ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ถ”๊ฐ€ ๋ Œ๋”๋ง ํŒจ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์„ธ์š”. ์ด ์ฝ”๋“œ๋Š” ์ถ”๊ฐ€ ๋ Œ๋”๋ง ์‚ฌ์ดํด์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๊ณ  props๋‚˜ state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

๋งŽ์€ ๊ฒฝ์šฐ Effect๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Effect๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ผ๋ฐ˜์ ์ธ ์œ„๋ฐ˜ ์‚ฌ๋ก€ {/common-violations/}

์ด ๊ทœ์น™์€ ๋™๊ธฐ์ ์œผ๋กœ setState๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ํŒจํ„ด์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์„ค์ •
  • Effect์—์„œ props๋กœ๋ถ€ํ„ฐ state ํŒŒ์ƒ
  • ๋ Œ๋”๋ง ๋Œ€์‹  Effect์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜

์ž˜๋ชป๋œ ์˜ˆ์‹œ {/invalid/}

์ด ๊ทœ์น™์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ฝ”๋“œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// โŒ Effect์—์„œ ๋™๊ธฐ์ ์œผ๋กœ setState
function Component({data}) {
  const [items, setItems] = useState([]);

  useEffect(() => {
    setItems(data); // ์ถ”๊ฐ€ ๋ Œ๋”๋ง, ๋Œ€์‹  ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”
  }, [data]);
}

// โŒ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์„ค์ •
function Component() {
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    setLoading(true); // ๋™๊ธฐ์ , ์ถ”๊ฐ€ ๋ Œ๋”๋ง ๋ฐœ์ƒ
    fetchData().then(() => setLoading(false));
  }, []);
}

// โŒ Effect์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜
function Component({rawData}) {
  const [processed, setProcessed] = useState([]);

  useEffect(() => {
    setProcessed(rawData.map(transform)); // ๋ Œ๋”๋ง ์ค‘์— ์ƒ์„ฑํ•ด์•ผ ํ•จ
  }, [rawData]);
}

// โŒ props๋กœ๋ถ€ํ„ฐ state ํŒŒ์ƒ
function Component({selectedId, items}) {
  const [selected, setSelected] = useState(null);

  useEffect(() => {
    setSelected(items.find(i => i.id === selectedId));
  }, [selectedId, items]);
}

์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ {/valid/}

์ด ๊ทœ์น™์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// โœ… ๊ฐ’์ด ref์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ Effect์—์„œ setState๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค
function Tooltip() {
  const ref = useRef(null);
  const [tooltipHeight, setTooltipHeight] = useState(0);

  useLayoutEffect(() => {
    const { height } = ref.current.getBoundingClientRect();
    setTooltipHeight(height);
  }, []);
}

// โœ… ๋ Œ๋”๋ง ์ค‘์— ๊ณ„์‚ฐ
function Component({selectedId, items}) {
  const selected = items.find(i => i.id === selectedId);
  return <div>{selected?.name}</div>;
}

๊ธฐ์กด props๋‚˜ state๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ state์— ๋„ฃ์ง€ ๋งˆ์„ธ์š”. ๋Œ€์‹  ๋ Œ๋”๋ง ์ค‘์— ๊ณ„์‚ฐํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Effect๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.