React: componentDidUpdate์—์„œ DOM ์กฐ์ž‘

์— ๋งŒ๋“  2016๋…„ 09์›” 23์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด๊ฒƒ์€ ์งˆ๋ฌธ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. componentDidUpdate DOM ์กฐ์ž‘์— ๊ด€ํ•œ ํ† ๋ก ์„ ์—ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

React ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. CSS๋Š” ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃฐ ๋งŒํผ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ DOM ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ํ•ด ๋ Œ๋”๋ง๋œ ๋‹ค๋ฅธ DOM ์š”์†Œ์˜ getBoundingClientRect() ๋ฐ˜ํ™˜ ๊ฐ’์— ๋”ฐ๋ผ ์ผ๋ถ€ CSS ์†์„ฑ์„ ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ์ˆ ์ ์œผ๋กœ 3๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) getBoundingClientRect ์—์„œ componentDidUpdate setState ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ณ„์‚ฐ๋œ ๊ฐ’์œผ๋กœ

2) 1)๊ณผ ๊ฐ™์ด ํ•˜๊ณ  shouldComponentUpdate ๋กœ ์•ฝ๊ฐ„์˜ ํ”Œ๋ ˆ์ด๋ฅผ ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์ฝ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋งŽ์€ ์งˆ๋ฌธ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

3) componentDidUpdate์—์„œ DOM์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ฒฐ์ •ํ•œ ์†”๋ฃจ์…˜์ด๋ฉฐ ์ž‘๋™ํ•˜๋ฉฐ ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ผ์„ ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ธ์ง€ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. componentDidUpdate ์—์„œ DOM์„ ์กฐ์ž‘ํ•ด๋„ ๋ฉ๋‹ˆ๊นŒ? render ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋ฉฐ ๋‹ค์Œ render DOM์„ ๋‹ค์‹œ ์ˆ˜์ •ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ฝ”๋“œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

componentDidMount() {
  this.recalculateIndent();
}

componentDidUpdate() {
  this.recalculateIndent();
}

recalculateIndent() {
  // calculate indent based on getBoundingClientRect of some DOM reference
  this.textareaRef.style.textIndent = `${indent}px`;
}

render() {
   return (
   ...
   <textarea ref={ref => this.textareaRef = ref}/>
   ...
   );
}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

componentDidUpdate ์‚ฌ์šฉํ•˜๋Š” @jvorcak ์€ ๋ Œ๋”๋ง ํ›„ DOM์„ ์ˆ˜๋™์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ๋”ฐ๋ผ:

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์„ ๋•Œ DOM์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋กœ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ ๊ธฐ๋Šฅ ์š”์ฒญ ๋ฐ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์—๋งŒ ๋ฌธ์ œ ์ถ”์ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ• ์งˆ๋ฌธ์€ ํ† ๋ก .reactjs.org ๋˜๋Š” StackOverflow์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

๋ชจ๋“  3 ๋Œ“๊ธ€

๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์—๋Š” ๊ฐ๊ฐ์˜ ์†”๋ฃจ์…˜(์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฐฉ์‹)์ด ์ ํ•ฉํ•˜์ง€๋งŒ DOM ์กฐ์ž‘์€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋‹ค. ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ์‚ฌ๋ก€ "ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ณ ์ • ํ—ค๋” + ํ…Œ์ด๋ธ” ๋ณธ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ€์ƒ ์Šคํฌ๋กค"์— ๋Œ€ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  1. ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ์ž: ์ดˆ๊ธฐ ์ƒํƒœ ๊ฐ’: bodyHeight = 0(๋˜๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ null).
  2. ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง์€ ํ…Œ์ด๋ธ” ํ—ค๋”๋ฅผ ๋ Œ๋”๋งํ•˜์ง€๋งŒ ๋นˆ ํ…Œ์ด๋ธ” ๋ณธ๋ฌธ(0 ํ–‰)์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  3. componentDidMount - ํ—ค๋” ๋ฐ ์ปจํ…Œ์ด๋„ˆ DOM ๋†’์ด(+ ์ผ๋ถ€ ๊ณ„์‚ฐ...) ๋ฐ bodyHeight์— ๋Œ€ํ•œ setState(๋‹ค์‹œ ๋ Œ๋”๋ง)๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  4. ๋‘ ๋ฒˆ์งธ ๋ Œ๋”๋ง, bodyHeight !== 0, ํ…Œ์ด๋ธ” ๋ณธ๋ฌธ์ด ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋†’์ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค( DOM ์กฐ์ž‘ ๋Œ€์‹  "์Šคํƒ€์ผ" ๊ตฌ์„ฑ ์š”์†Œ prop์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ ). ํ–‰์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. "ํฌ๊ธฐ ์กฐ์ •"(๋ฌธ์„œ/๋ธŒ๋ผ์šฐ์ € ํฌ๊ธฐ ์กฐ์ •)์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, componentDidMount์—์„œ ์ถ”๊ฐ€, componentWillUnmount์—์„œ ์ œ๊ฑฐ. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ componentDidMount์—์„œ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ DOM ๋†’์ด ๊ฐ’๊ณผ setState๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  6. ์†์œผ๋กœ DOM์„ ์กฐ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋ฐ˜์‘์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

componentDidUpdate ์‚ฌ์šฉํ•˜๋Š” @jvorcak ์€ ๋ Œ๋”๋ง ํ›„ DOM์„ ์ˆ˜๋™์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ๋”ฐ๋ผ:

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์„ ๋•Œ DOM์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋กœ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ ๊ธฐ๋Šฅ ์š”์ฒญ ๋ฐ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์—๋งŒ ๋ฌธ์ œ ์ถ”์ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ• ์งˆ๋ฌธ์€ ํ† ๋ก .reactjs.org ๋˜๋Š” StackOverflow์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰