React: componentDidReceiveProps ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค

์— ๋งŒ๋“  2015๋…„ 02์›” 27์ผ  ยท  94์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

๋‚˜๋Š” ๊ฒธ์†ํ•˜๊ฒŒ componentDidReceiveProps ํ›„ํฌ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ข…์ข… componentWillMount์™€ componentWillReceiveProps ๋ชจ๋‘์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์‹ถ์ง€๋งŒ this.props ๊ฐ€ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— this.props .

์ƒˆ ํ›„ํฌ ์ด์ „

componentWillMount() {
  this.setup(this.props.id);
}

componentWillReceiveProps(next) {
  this.setup(next.id);
}

setup(id) {
  UserActions.load(id);
}

์ƒˆ๋กœ์šด ํ›„ํฌ ์ดํ›„

componentWillMount() {
  this.setup();
}

componentDidReceiveProps() {
  this.setup();
}

setup() {
  UserActions.load(this.props.id);
}

์ด ๊ฐ„๋‹จํ•œ ์˜ˆ์—์„œ๋Š” ์‚ฌ์†Œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ข…์ข… props ์ „๋‹ฌ์ด ๊นŠ๊ฒŒ ์‹คํ–‰๋˜๊ณ  this.props๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์‹  ์ปดํฌ๋„ŒํŠธ ์ „์ฒด์— props๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

componentDidReceiveProps ๋ฅผ ํ›„ํฌ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ componentWillMount์—์„œ ํ™œ์šฉ๋˜๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ ์ „์ฒด์— ๊ฑธ์ณ props๋ฅผ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

@syranide ๋ฌธ์ œ๋Š” ์„ค์ •์ด ์†Œํ’ˆ๋„ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ณ , ์†Œํ’ˆ๋„ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค... ๊ฒฐ๊ตญ ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์†Œํ’ˆ์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์™œ setup(props) ์•„๋‹Œ๊ฐ€์š”?

๋‚ด ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋น„์Šทํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ณณ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒํƒœ ์ฒญํฌ๋ฅผ ํŒŒ์ƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค). ํ•„์š”ํ•  ๋•Œ ๋‹ค๋ฅธ props ์„ธํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ถ”๊ฐ€ ํ•ญ๋ชฉ๋งŒ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค props๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•œ ์ง€์‹์„ ๋ณต์ œํ•˜์ง€ ์•Š๊ณ :

setup(props) {
  props = props || this.props
  UserActions.load(props.id)
}

@syranide ๋ฌธ์ œ๋Š” ์„ค์ •์ด ์†Œํ’ˆ๋„ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ณ , ์†Œํ’ˆ๋„ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค... ๊ฒฐ๊ตญ ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์†Œํ’ˆ์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

+1์€ ํ˜„์žฌ ํŒจํ„ด์œผ๋กœ ์•ฑ์— ๋ถˆํ•„์š”ํ•œ ๋ฐฐ์„ ์„ ๋งŽ์ด ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๊ฒฐํ•˜๊ณ  ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ComponentWillReceiveProps ๋‚ด๋ถ€์˜ this.props์— ํ™”์ƒ์„ ์ž…๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๋Š” ๋ช…๋ฐฑํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

+1, ์ €๋„ ์ด๊ฒŒ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

+1, ์†Œํ’ˆ๋„ ๋งŽ์ด ๋Œ์•„๋‹ค๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ @insin๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž ์‹œ ๋™์•ˆ ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

setup(props = this.props) {
  doSomething(props);
}

๊ทธ๋Ÿฌ๋‚˜ newProps๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ์•ˆํ‹ฐ ํŒจํ„ด์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

+1

์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” this.props ๋ฐ this.state _always_๊ฐ€ ๋ Œ๋”๋ง๋œ ๊ฐ’์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๋Š” componentDidReceiveProps ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ componentWillReceiveProps ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ๋Š” Relay ๋˜๋Š” React 0.14์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ observe hook ๊ณผ ๊ฐ™์€ ๊ณ ์ฐจ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

+1
๋˜ํ•œ this.props ๋˜๋Š” this.state ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  componentDidReceiveProps ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์—์„œ ์ฝ๊ธฐ๋งŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ Œ๋”๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋‚ด์—์„œ props ๋˜๋Š” state์— ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์— ์ด์„ ์˜๊ณ  ์žˆ์ง€๋งŒ ๋ผ์ดํ”„ ์‚ฌ์ดํด์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

+1

shouldComponentUpdate ์ด false ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ƒˆ๋กœ์šด props ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์ œ ๊ฒฝ์šฐ์—๋Š” componentDidUpdate ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

+1

+1

componentWillMount ๋ฐ componentWillUpdate @iammerrick componentWillUpdate ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

shouldComponentUpdate๊ฐ€ false๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ƒˆ props ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์ œ ๊ฒฝ์šฐ์—๋Š” componentDidUpdate๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

componentWillReceiveProps ?

+1

+1 ์ด๊ฒƒ์€ DRY ์ฝ”๋“œ์™€ ๋…ผ๋ฆฌ ๋‹จ์ˆœํ™”์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋‹จ์ผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐ ์„ค์ •์—์„œ componentDidReceiveProps๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

componentDidReceiveProps() {
  UserActions.load(this.props.id);
}

์ƒ๊ฐ?

componentWillReceiveProps() {
  setTimeout(()=> {
    if(this.isMounted()) {
      this.componentDidReceiveProps();
    }
  });
}
componentDidReceiveProps() {
  UserActions.load(this.props.id);
}

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‚˜์š”?

@YourDeveloperFriend ์ค‘์ฒฉ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ณ„๋‹จ์‹ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ํ›„ํฌ ๋ฐ ๋ Œ๋”๋ง ์ง€์—ฐ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ํ›„ํฌ๋Š” ๋ Œ๋”๋ง ์ „์— ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋Š” ํŒจ์Šค์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” React์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ตฌํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ Œ๋”๋ง์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์‚ฌ์ „ ๋ Œ๋”๋ง ํ›„ํฌ๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ props๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ๋ Œ๋”๋ง ๋…ผ๋ฆฌ๊ฐ€ render๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— componentDidReceiveProps๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1 ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ชป์ƒ๊ฒผ๋‹ค.

์•„๋‹ˆ, ๋‚œ ๊ดœ์ฐฎ์•„. ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

+1

componentDidReceiveProps() ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. render() ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @iammerrick ์˜ ์˜ˆ์™€ ๊ฐ™์ด ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋กœ๋“œ/ํŠธ๋ฆฌ๊ฑฐ/๊ธฐํƒ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ ํ•œ ๊ฐ€์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ญ”๊ฐ€๋ฅผ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•  ๋•Œ

setup(id) {
    UserActions.load(id);
}

๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” (ํ›จ์”ฌ ๋” ๋‚˜์œ) ์™ธ๋ถ€์— statefullness๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์™œ ์ง€๊ธˆํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ load() ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์†Œํ’ˆ์„ ์ˆ˜์‹  ํ•  ๋•Œ๋งˆ๋‹ค (๊ทธ๋“ค์€ ์‹ฌ์ง€์–ด ์ƒˆ๋กœ์šด ๋ณด์žฅ๋˜์ง€ ์•Š์Œ)? ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ•œ๋‹ค๋ฉด render() ๋ฉ”์†Œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค:

render() {
    var actions = UserActions.load(id);
    if (actions) // render
    else // show spinner or return null, etc.
}

UserActions.load = function(id) {
    if (data) return data;
    else // request the data, emit change on success
}

@robyoder , ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ถ”์•…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์žฅํ™ฉํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์„ ํƒํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ์žฅํ™ฉํ•จ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์—ฌ๋ถ„์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ API๋ฅผ ํ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.

@me-andre, ์™œ ์šฐ๋ฆฌ๋Š” componentWillUpdate ์™€ componentWillReceiveProps ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‘˜ ๋‹ค ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋‘˜์ด ๊ฐ™์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ render ๋Š” ๊ฐ€์ƒ์˜ componentDidReceiveProps ์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ƒˆ๋กœ์šด props๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ด์œ ๋กœ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ „ ์†Œํ’ˆ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ „ ์†Œํ’ˆ์˜ ์ด์ ์€ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. props ๋ฐ ๋ณ€๊ฒฝ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ "[์ถ”ํ•จ]์€ ๋ณด๋Š” ์‚ฌ๋žŒ์˜ ๋ˆˆ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค." ์ ์ ˆํ•œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฑธ ๋ณด๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์„์ง€๋„...

์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(1) ์ธ์  ์˜ค๋ฅ˜ ๊ฐ์†Œ - ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ์„ ์žŠ์—ˆ๊ฑฐ๋‚˜ props = props || this.props ๋‹ค์‹œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
(2) ๋ถ€๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด - ์™œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ?
(3) ์–ด๋–ค ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ธ์ง€์  ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด - ์™œ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€, ์™œ ๊ทธ๋‚  ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋“ฑ

๋”ฐ๋ผ์„œ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„์€ ์ด๋Ÿฌํ•œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด React์™€ React API ์ž์ฒด์˜ ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชฉํ‘œ๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ผ๋ถ€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐํ™” ๋Œ€ ์—…๋ฐ์ดํŠธ์ธ์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์„œ๋ช…/์ธ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: beforeRender(prevProps, prevState) ๋˜๋Š” update(prevProps, prevState) .

๊ฐœ์ธ์ ์œผ๋กœ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ณ  ์ผ๊ด€๋˜๊ฒŒ ํ˜ธ์ถœ๋˜๋ฉด(์ดˆ๊ธฐ ์ „๋‹ฌ ๋ฐ ์—…๋ฐ์ดํŠธ ์‹œ prevProps / prevState ์—†์ด ๋˜๋Š” ํ•จ๊ป˜) ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๊ฝค ๊ธธ๋ฉฐ(์ €๋Š” ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค) ์–ด๋Š ๊ฒƒ์ด ์กด์žฌํ•˜๋Š”์ง€ ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@robyoder , ์™œ ์šฐ๋ฆฌ๊ฐ€ componentWillUpdate ์™€ componentDidReceiveProps ๋‘˜ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์งง์€ ๋Œ€๋‹ต์€ ๋‘˜ ์‚ฌ์ด์— ์—„์ฒญ๋‚œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋น„์Šทํ•˜์ง€๋งŒ ์ฃผ๋กœ componentWill ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค.

| | ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค | ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค |
| --- | --- | --- |
| componentWillUpdate() | ๋„ค | ์•„๋‹ˆ |
| componentWillReceiveProps() | ์•„๋‹ˆ | ๋„ค |

ํ•œ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ๋˜๊ณ  ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ง€์ /์กฐ๊ฑด์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 2๊ฐ€์ง€ ๊ณ ์œ ํ•œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•ญ๋ชฉ์— ์„ค๋ช…๋œ ๋Œ€๋กœ componentDidReceiveProps() ๋Š” ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ ๋˜๋Š” ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์œผ๋ฉฐ componentWillReceiveProps() ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๊ฑฐ๋‚˜ ๋” ์‰ฌ์›Œ ๋ณด์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ์•ฝ๊ฐ„์˜ ๊ตฌ๋ฌธ์  ์„คํƒ•์„ ์ถ”๊ฐ€ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ์ˆ ์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ ์ด ์•„๋‹ˆ๋ผ

@me-andre ๋‹น์‹ ์€ ์ €(@kmalakoff)์™€ @robyoder ์—๊ฒŒ ๋™์‹œ์— ์‘๋‹ตํ•˜๊ณ 

๋‚ด๊ฐ€ ์ œ๊ธฐํ•œ ๊ฒƒ์€ ์•„๋งˆ๋„ ์œ„์˜ ์„ธ ๊ฐ€์ง€ ๋ชฉํ‘œ๋กœ ํ˜„์žฌ API์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ํ†ต์ฐฐ๋ ฅ์ด๋‚˜ ๊ด€์ ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์—ฐ์Šต์„ ํ•˜๊ณ  ๋‚˜๋ฉด ๊ฐ™์€ ์žฅ์†Œ์— ์˜ค๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์šด๋™์„ ํ•ด๋ณด์ž....

์ด ์ฃผ์ œ์— ์ค‘์š”ํ•œ ๊ฒƒ์ด ์žˆ๊ณ  componentDidReceiveProps ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ API ๋…ธ์ถœ ์˜์—ญ์„ ๋Š˜๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ‘œ์™€ ๋‚ด๊ฐ€ ์ œ์‹œํ•œ 3๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ฑฐ๋‚˜ ์ด ์Šค๋ ˆ๋“œ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•˜๊ณ  API๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? )?

@kmalakoff , ๋ง์”€ํ•˜์‹  3๊ฐ€์ง€ ํฌ์ธํŠธ๋Š” ๋งŒ๋‚ฌ์„ ๋•Œ API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ๋งŒ API์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‚˜์œ ๋””์ž์ธ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ธ์ˆ˜๋ฅผ ์ทจํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. componentWillReceiveProps ๋Š” ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ๋‹ฌ์ด ์ฐผ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์•„์ง ๊ตฌ์„ฑ ์š”์†Œ์— ํ• ๋‹น๋˜์ง€ ์•Š์€ props๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ props๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. props ๋Š” this.props ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์—์„œ๋งŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํžŒํŠธ์ž…๋‹ˆ๋‹ค.
๋ฌธ์ œ # 3์€ ์‚ฌ์šฉํ•  ์ฝœ๋ฐฑ/์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์œ„์—์„œ ์ด์•ผ๊ธฐํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ๋™์ผํ•œ ์„œ๋ช…์„ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฉ๋ฒ•์—์„œ state ๋ฐ this.state , props ๋ฐ this.props ๊ฐ€ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด(๋ฌด์˜๋ฏธํ•˜๊ฒŒ ์ฝ์Œ) ์˜ˆ๋น„ ์˜ต์…˜์— ์–ฝํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ.
๋ฌธ์ œ # 2๋Š” ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค... ๊ธ€์Ž„์š”, React๋Š” ์–‡์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ฆ„๋‹ต๊ณ  ์‰ฝ๊ณ  ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์‚ถ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋งค์ผ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๋Š” ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์™œ ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๋กœ ๊ฒŒ์‹œ ์ž์‹ ์˜ npm ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค react ๋‹น์‹ ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

"์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค"์™€ ๊ด€๋ จํ•˜์—ฌ - ์•„์ง ๊ธฐ์ˆ ์ ์ธ ํ•„์š”๊ฐ€ ์—†๋Š” ์ƒˆ ์ฝœ๋ฐฑ ์š”์ฒญ์„ ์ค‘๋‹จํ•˜๋”๋ผ๋„ ์•ž์œผ๋กœ๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์ธ ํ•„์š”๋Š” ๋ณต์žกํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ž‘์—… ์ค‘์— ์ถ”์•…ํ•œ ํ•ดํ‚น ์—†์ด๋Š” ์ ˆ๋Œ€์  ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜

๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜ ๋”...
์ž˜ ์„ค๊ณ„๋œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. getInitialState , componentWillMount , componentWillUnmount ์‹œ๊ฐ„์˜ 99%๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋Œ€์ ์œผ๋กœ ํฐ ์ƒ์šฉ ์•ฑ์ธ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ componentWillReceiveProps ๋Š” ๋ชจ๋“  ์•ฑ์—์„œ ๋‘ ๋ฒˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ € ์ฝ๊ธฐ)์ด ๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค. scrollTop ์™€ ๊ฐ™์€ ํŠน์ • "์ž์ฒด ์ƒํƒœ ์ €์žฅ"์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ž˜์˜ render ๋Œ€ํ•œ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. props ์ „ํ™˜๊ณผ DOM ๋ณ€๊ฒฝ ๊ฐ„์— ์ˆ˜๋™ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ "์ •์ƒ์ ์ธ" ๊ฒฝ์šฐ์—๋Š” props ์ „ํ™˜์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ์  ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@me-andre๋Š” React๋กœ ์ž‘์—…ํ•œ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ API๋ฅผ ๊ฐœ์„ /๋‹จ์ˆœํ™”ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜ผ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ์ฒ˜์Œ์— ์ œ๊ธฐ๋˜์—ˆ๊ณ  +1-ed๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ API๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ˜์‹ ์„ ํ•˜๊ณ  ์ฝ”์–ด๋กœ ๋กค๋ฐฑํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ API๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์™„๋ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์”€์ด ๋งž์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ํŒ€.

๋‹น์‹ ์ด ์žˆ๋Š” ๊ทธ๋Œ€๋กœ์˜ ์ฃผ์žฅ์„ ํ•˜๋Š” ์ด์œ ๋Š” ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ API์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ๋‚ฎ๊ณ  ๊ฑฐ๊ธฐ์— ๋“ค์–ด๊ฐ„ ๊ฒฐ์ •์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์ž์ด๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ๊ณผ ๋˜‘๊ฐ™์ด ๊ฒฝํ—˜์ด ๋งŽ๊ณ  ์ง€์‹์ด ํ’๋ถ€ํ•œ ๋‹ค๋ฅธ React ํŒ€์›๋“ค์„ ๋Œ์–ด๋“ค์—ฌ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๊ด€์ ์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์„ ์ œ์‹œํ•˜๊ฑฐ๋‚˜ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ํ›Œ๋ฅญํ•˜๋‹ค๋Š” ํ•ฉ์˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@kmalakoff , React๊ฐ€ ์—”์ง„๊ณผ 4๊ฐœ์˜ ๋ฐ”ํ€ด๋ผ๊ณ  ์ƒ์ƒํ•ด
๋‚ด๊ฐ€ ์ถ”์ฒœํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์™„์ „ํ•œ ์ฐจ๋Ÿ‰(์™„์ „ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ)์„ ์–ป๊ฑฐ๋‚˜ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์Šค๋ ˆ๋“œ์—์„œ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ์€ ์—”์ง„์— ์œ ์•• ์‹œ์Šคํ…œ๊ณผ ์‹ค๋‚ด๋“ฑ์ด ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•˜๋Š” ์—”์ง„ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋Š๋ผ๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์†ํ•˜์ง€ ์•Š๋Š” ๊ณณ์— ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์™„์ „ํžˆ ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
React๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์‹œ์Šคํ…œ์„ ๋…ธ์ถœํ•˜๋Š” diff ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์—”์ง„์ž…๋‹ˆ๋‹ค. ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ตœ์†Œํ•œ์˜ API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๊ทธ ์œ„์— ๋ง ๊ทธ๋Œ€๋กœ ๋ฌด์—‡์ด๋“  ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ์ €์—๊ฒŒ ์—ฐ๋ฝํ•˜์‹ญ์‹œ์˜ค. ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ํŠœํ† ๋ฆฌ์–ผ์ด ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@me-andre ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๋‹น์‹ ์˜ ์ž…์žฅ๊ณผ ๋‹น์‹ ์˜ ์ฃผ์žฅ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! API๊ฐ€ ์ด๋ฏธ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋งŒํผ ํ›Œ๋ฅญํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์˜ณ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฐœ์„ ๋  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ API ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์–‘ํ•œ ์˜ต์…˜์— ๋Œ€ํ•œ ๋น„๊ต ๋ถ„์„ ์ œ๊ณต(componentDidReceiveProps ์ถ”๊ฐ€ ๋Œ€ API ๋ณ‘ํ•ฉ/๋‹จ์ˆœํ™” ๋Œ€ ๋ณ€๊ฒฝ ์—†์Œ)

React ํŒ€์€ ์ด ๋ฌธ์ œ๋ฅผ ์ง€์ผœ๋ณด๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ €๋Š” ํ•ญ์ƒ API ๋…ธ์ถœ ์˜์—ญ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ธฐ์šธ๊ณ  ์žˆ์œผ๋ฏ€๋กœ @me-andre์˜ ์ฃผ์žฅ์— ๊ธฐ๋Œˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ ํŒ€์€ ๋•Œ๋•Œ๋กœ componentDidReceiveProps ๋ฅผ "์žƒ์–ด๋ฒ„๋ฆฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•"์œผ๋กœ ์• ์ • ์–ด๋ฆฐ ํ‘œํ˜„์œผ๋กœ ์–ธ๊ธ‰ํ•˜๋ฉฐ ์ž ์žฌ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ง„์ง€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‚˜์œ ๊ด€ํ–‰์„ ์ด‰์ง„ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ(๋˜๋Š” ์ ์–ด๋„ ๋‚˜)์—๊ฒŒ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ์‹์„ ์›ํ•˜๋Š” ์ด์œ ๋ฅผ ํ™•์‹คํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์—์„œ ์ถฉ๋ถ„ํžˆ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์ด ์ˆ˜๋ช… ์ฃผ๊ธฐ์—์„œ ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ์™œ ๋ˆ„๊ตฐ๊ฐ€์˜ ํฌ๋ง์ด ํ•  ๊ฒƒ UserActions.load(id); ์—์„œ componentDidReceiveProps ๋Œ€์‹ ์— ์ œ์•ˆ ๋ Œ๋”๋ง ๋‚ด์—์„œ์˜ https://github.com/facebook/react/issues/3279#issuecomment -163875454 (๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.) props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@jimfb ๋‚˜๋Š” componentDidReceiveProps ๊ฐ€ ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ถ€์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ธฐ๊บผ์ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด react-router ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    <Route path="/profile/:username" component={ProfilePage} />

์™ธ๋ถ€ ์†Œ์Šค์—์„œ ํ”„๋กœํ•„์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ณ  ์ด๋ฅผ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด componentDidMount ๋ฉ”์„œ๋“œ์—์„œ HTTP ์š”์ฒญ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํ•œ ํ”„๋กœํ•„์—์„œ ๋‹ค๋ฅธ ํ”„๋กœํ•„๋กœ ์ด๋™ํ•  ๋•Œ React Router๋Š” ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ๋‚˜ componentDidMount ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋ฒ„๊ทธ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค) .

์ด๋ก ์ ์ธ componentDidReceiveProps ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์„ ๊ณ ์น  ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ componentWillReceiveProps ๋Š” ๋‚ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ํฌ์ธํ„ฐ๋Š” ํฌ๊ฒŒ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ง๊ฐ์€ componentDidReceiveProps ์ด ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@shea256 componentWillReceiveProps ์ด(๊ฐ€) ๊ท€ํ•˜์˜ ์š”๊ตฌ์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@shea256 ๋˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ HTTP ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•ด๋‹น http ์š”์ฒญ์—๋Š” ๋ฌด์—‡์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ์ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ฝœ๋ฐฑ์ด ๋ฐ˜ํ™˜๋  ๋•Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@jimfb ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” prop ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ๋ถ€ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด props๋ฅผ ํƒ‘์žฌํ•˜๊ณ  ์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋‘ ๋™์ผํ•œ ๋กœ๋“œ ์ฃผ๊ธฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ componentDidMount ๋ฐ componentWillReceiveProps ๋Š” ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค. render ์—๋Š” ์ƒˆ๋กœ์šด ์†Œํ’ˆ์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉฐ ์–ด์จŒ๋“  render์˜ setState๋Š” no-no์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋กœ๋”ฉ์„ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚œ์— ํ†ต๊ณผํ•ด์•ผ props ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ this.props ์— ๋Œ€ํ•œ ์ตœ์‹ ์ด componentWillReceiveProps . ์ด๊ฒƒ์€ ์ „๋‹ฌ๋œ props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋„์ฐฉํ•  ๋•Œ ๋ฏธ๋ฌ˜ํ•œ one-behind ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์˜ ์„œ๋ช…์€ props๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ํ˜„์žฌ API๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ React๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”ผํ•˜๋Š” ๋ฐ ๋งค์šฐ ๋Šฅ์ˆ™ํ•œ ๋” ์„œํˆฌ๋ฅด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

@jimfb routeParam ์—์„œ ์ƒˆ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ณ  componentWillReceiveProps ๋กœ๋Š” ์•„์ง ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์†Œ์Šค์—์„œ ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด HTTP ์š”์ฒญ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ฐ์ดํ„ฐ๋Š” ๋กœ์ปฌ์— ์ €์žฅ๋˜์ง€ ์•Š์Œ).

๊ทธ๋ฆฌ๊ณ  render ๋ฉ”์„œ๋“œ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฝ๊ฐ„ ์ง€์ €๋ถ„ํ•œ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

constructor(props) {
  super(props)

  this.state = {
    id: this.props.routeParams.id,
    profile: {}
  }
}

componentDidMount() {
  this.getProfile(this.state.id)
}

render() {
  if (this.props.routeParams.id !== this.state.id) {
    this.getProfile(this.props.routeParams.id)
  }

  return (
    <div>
      <div className="name">
       {this.state.profile.name}
      </div>
    </div>
  )
}

@grassick ์€ ๋‹ค์Œ

์ €์—๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” prop ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ๋ถ€ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ์ •ํ™•ํžˆ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

์ƒˆ props๋ฅผ ํƒ‘์žฌํ•˜๊ณ  ์ˆ˜์‹ ํ•  ๋•Œ ๋ชจ๋‘ ์ด ๋™์ผํ•œ ๋กœ๋“œ ์ฃผ๊ธฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ componentDidMount ๋ฐ componentWillReceiveProps๊ฐ€ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค.

์ž˜ํ–ˆ๋‹ค.

@shea256 ๋Œ€์‹  componentWillReceiveProps ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

constructor(props) {
  super(props)

  this.state = {
    id: this.props.routeParams.id,
    profile: {}
  }
}

componentDidMount() {
  this.getProfile(this.state.id)
}

componentWillReceiveProps(nextProps) {
  let { id } = nextProps.params
  if(id !== this.state.id) {
    this.getProfile(id, (profile) => {
      this.setState({ id: id, profile: profile })
    })
  }
}

render() {
  return (
    <div>
      <div className="name">
       {this.state.profile.name}
      </div>
    </div>
  )
}

@grassick ์€ ๋‹ค์Œ

์ €์—๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” prop ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ๋ถ€ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@grassick ์€ ๋‹ค์Œ

render๋Š” ๊ทธ๊ฒƒ์ด ์ƒˆ๋กœ์šด prop์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์–ด์จŒ๋“  render์˜ setState๋Š” no-no์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ฐ„๋‹จํžˆ ๋งํ•˜์‹ญ์‹œ์˜ค. componentDidUpdate ๊ฐ€ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์—์„œ ํ˜ธ์ถœ๋˜๋ฉด(์ดํ›„ ๋ Œ๋”๋ง๊ณผ ํ•จ๊ป˜) ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ? props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ componentDidUpdate ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์ฃ ? ๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋ง์—์„œ this.state.profileName != this.props.profileName ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋Œ€์•ˆ์ด ๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ?


์†Œํ’ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@calmdev ํ , ๋‚˜๋Š” ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

@jimfb ์•„๋งˆ๋„ componentDidUpdate ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  this.state.profileName != this.props.profileName ์™„์ „ํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ๋„ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด ์‹œ์ ์—์„œ componentWillReceiveProps(nextProps) ๊ฐ€ ์ž‘๋™ํ•˜๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ €๋ฅผ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์€ componentDidMount ์™€์˜ ๋Œ€์นญ์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. componentDidMount ๋Œ€์‹  componentWillMount ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ „์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋” ๊นจ๋—ํ•ด์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@shea256 , ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค... React์— ๋Œ€ํ•œ README ์ฝ์–ด ๋ณด์…จ๋‚˜์š”?
๊ทธ๋ ‡๊ฒŒ ๋งํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๋„๊ตฌ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ๋Š” ๊ทธ๊ฒƒ์ด... ํ„ฐ๋ฌด๋‹ˆ์—†์ด ๋“ค๋ฆฐ๋‹ค.
" componentDidMount ๋Œ€์‹  componentWillMount ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ์š”?"
์•„๋‹ˆ์š”, ์ถ”๊ฐ€ ์ •๋ณด์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ DOM์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— componentWillMount ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ํ›„์— componentDidMount ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๋‹น์‹ ์€ ํ™•์‹คํžˆ ํ•œ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ์ด์œ ๋Š” ๋ฏธํ•™์ด ์•„๋‹™๋‹ˆ๋‹ค("๋Œ€์นญ" ์ฐธ์กฐ). ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ์ค€๋น„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ํ›„์— ์ผ๋ถ€ ์ดˆ๊ธฐ DOM ์ฟผ๋ฆฌ/์กฐ์ž‘์„ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‰๊ท ์ ์ธ React ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ์ด์ƒ‰์ ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ DOM์— ์ˆ˜๋™์œผ๋กœ ์•ก์„ธ์Šคํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
"๊ทธ๋ฆฌ๊ณ  this.state.profileName != this.props.profileName์„ ์™„์ „ํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ๋„ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?"
์˜ˆ, ๊ท€ํ•˜์˜ ์ „์ฒด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  componentDidReceiveProps ๊ฐ€ props ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ๋ˆ„๊ฐ€ ๋งํ–ˆ์Šต๋‹ˆ๊นŒ? shouldComponentUpdate ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ํ•œ ์•„๋ฌด ๊ฒƒ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฐ”๋กœ React๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

@me-andre ์ฐธ์—ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ์ทจํ–ฅ์— ๋น„ํ•ด ๋„ˆ๋ฌด ๊ณผ๊ฒฉํ•˜์‹œ๋„ค์š”. ๋˜ํ•œ ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด ์งˆ๋ฌธ์„ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” componentWillMount ๋ฐ componentDidMount ๊ฐ€ ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @jimfb๋‹˜ ์˜ ๋‹ต๋ณ€์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

@shea256 ,
"๋˜ํ•œ ๋‹น์‹ ์ด ๋‚ด ์งˆ๋ฌธ์„ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
์งˆ๋ฌธ์— ๋‹ตํ•  ๋•Œ ์ œ๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์„ ์ง€์ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋˜ํ•œ ์งˆ๋ฌธํ•˜๋ ค๋Š” ๋‚ด์šฉ์„ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ์„ฑ๊ฒฉ์ด๋‚˜ ์ทจํ–ฅ์„ ๋…ผํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์ ์ธ ๋Œ€ํ™”๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ธฐ์ˆ  ์ง€์›๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€์‹์˜ ์ผ๋ถ€ ์˜์—ญ์„ ์•ˆ๋‚ดํ•ด ์ค„ ์Šคํƒ ๊ตํ™˜ ์›น์‚ฌ์ดํŠธ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
์ €๋Š” ์ง€์—ญ ๋ชจ์ž„๊ณผ ๊ตญ์ œ ํšŒ์˜์—์„œ React(๋ฟ๋งŒ ์•„๋‹ˆ๋ผ)์— ๋Œ€ํ•ด ์ž์ฃผ ์ด์•ผ๊ธฐํ•˜๋ฉฐ ์ง€์‹ ๊ณต์œ ์— ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‹œ๊ธฐ์™€ ์žฅ์†Œ์—์„œ ๋ง์ด์ฃ . ๋‹น์‹ ์€ ํ•ญ์ƒ ์ด๋ฉ”์ผ์ด๋‚˜ ์Šค์นด์ดํ”„๋ฅผ ํ†ตํ•ด ์ €์—๊ฒŒ ์ง์ ‘ ์—ฐ๋ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๊ด€๋ จ ๋ฌธ์ œ. ๊ธฐ๋Šฅ ์ง€ํ–ฅ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ณ ์ „์ ์ธ ๋ช…๋ น์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. React์˜ ๋ทฐ๋Š” props, state, environment์˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. function(state, props) { return // whatever you've computed from it } ์ฒ˜๋Ÿผ (ํ•˜์ง€๋งŒ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ๋Š” ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด React๊ฐ€ ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). 0.14 ์ˆœ์ˆ˜ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์–ป์ง€ ์ž…๋ ฅ ํ•จ์ˆ˜๋Š” render() ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ render() ๋ถ€ํ„ฐ ์“ฐ๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์†Œํ’ˆ์ด ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  props ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€, ๋ช‡ ๋ฒˆ, ์–ด๋””์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค . ๋‹น์‹ ์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// profile-view.js

var React = require('react');

module.exports = React.createClass({
    contextTypes: {
        app: React.PropTypes.object.isRequired
        // another option is var app = require('app')
        // or even var profiles = require('stores/profiles')
    },
    componentWillMount() {
        var {app} = this.context; // another option is to require('app')
        app.profiles.addListener('change', this.onStoreChange);
    },
    componentWillUnmount() {
        var {app} = this.context; // another option is to require('app')
        app.profiles.removeChangeListener('change', this.onStoreChange);
    },
    onStoreChange() {
        this.forceUpdate();
    },
    render() {
        var {app} = this.context;
        var profile = app.profiles.read(this.props.routeParams.id);
        if (profile) { // profile's been loaded
            return <div>{profile.name}</div>;
        } else { // not yet
            return <div>Loading...</div>;
        }
    }
});

// profiles-store.js
// app.profiles = new Profiles() on app initialization

var EventEmitter = require('events');
var {inherits} = require('util');

module.exports = Profiles;

function Profiles() {
    this.profiles = {};
}

inherits(Profiles, EventEmitter);

Profiles.prototype.read = function(id) {
    var profile = this.profiles[id];
    if (!profile) {
        $.get(`profiles/${id}`).then(profile => {
            this.profiles[id] = profile;
            this.emit('change');
        });
    }
    return profile;
};

์•„์ฃผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  componentDidReceiveProps ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. componentWillReceiveProps ๋ฐ ์œ ์‚ฌํ•œ ํ›„ํฌ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•œ ๊ฒฝ์šฐ์— ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๋‚€๋‹ค๋ฉด React์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์–ป์œผ๋ ค๋ฉด ์ ์ ˆํ•œ ๋ฆฌ์†Œ์Šค ๋ฅผ ์‚ฌ์šฉ ํ•˜๊ณ  ์ €์žฅ์†Œ์˜ Issues ์„น์…˜์„ ํ๊ธฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ œ ์ž…๋ง›์—๋Š” ์ข€ ๊ณผํ•œ ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚จ์˜ ์‹œ๊ฐ„์„ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค.

@me-andre ๋‹น์‹ ์ด ๋‹จ์ง€ ๋„์›€์„ ์ฃผ๋ ค๊ณ  ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋Œ€๋ฆฝ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์˜ ์–ธ์–ด๋ฅผ ์•ฝ๊ฐ„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ํ™˜์˜ํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•œ๋•Œ ๋ชจ๋‘ ๋‰ด๋น„์˜€์Šต๋‹ˆ๋‹ค. API/๋””์ž์ธ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์  ์ค‘ ์ผ๋ถ€๊ฐ€ ์ •ํ™•ํ•˜๋”๋ผ๋„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์ œ๋ฅผ +1ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ํ‘œ์‹œ์ด๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ๋ฌด์—‡์„/์™œ ์›ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ช… ์ฃผ๊ธฐ. ๋ฌธ์ œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ(๋ฌธ์„œ)๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถฉ๋ถ„ํžˆ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ React์˜ API์— ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ์—ฌ๊ธฐ์—์„œ ๋ถˆ๋งŒ/์งˆ๋ฌธ/์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@shea256 this.state.profileName != this.props.profileName ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ(๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๋‚ด์šฉ)๊ฐ€ ๋ถ€๋ชจ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋ Œ๋”๋งํ•˜๋„๋ก ์š”์ฒญํ•œ ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑฐ์˜ "๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ ์ค‘์ž…๋‹ˆ๋‹ค" ๋˜๋Š” "๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ตœ์‹  ์ƒํƒœ์ž…๋‹ˆ๋‹ค"์˜ ์ •์˜์ด๋ฏ€๋กœ ํ•ดํ‚น์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ "prop์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๊ณ  ์ฝœ๋ฐฑ์—์„œ setstate๋ฅผ ์ˆ˜ํ–‰"ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ณด๋‹ค ๋” ํ•ดํ‚น์€ ์—†์Šต๋‹ˆ๋‹ค.

@shea256 ๋ถ„๋ช…ํžˆ ์ฃผ๊ธฐ๋กœ ์ธํ•ด ํ˜„์žฌ์˜ ์ˆ˜๋ช… componentDidReceiveProps ์˜ ํ•„์š”์„ฑ์„ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ฐ€ componentDidReceiveProps๊ฐ€ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๊นŒ?

@me-andre๊ฐ€ ์—ฌ๊ธฐ์— ๋งž์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์€ ์‹ค์ œ๋กœ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹จ์ง€ ๋ฌด์–ธ๊ฐ€๊ฐ€ _์•„๋งˆ๋„_ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ http ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ previous === next ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ง€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@me-andre๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ์ง€ํ–ฅ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ณ ์ „์ ์ธ ๋ช…๋ น์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์ด ์ด ์ƒˆ๋กœ์šด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์„ ์›ํ•˜๋Š” ๊ทผ๋ณธ ์›์ธ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด์œ /๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ๊ณผ ์•ฝ๊ฐ„ ์ž˜๋ชป ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด: "prop ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ" ์™ธ์— componentDidReceiveProps ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

cc @grassick @iammerrick

@jimfb ๋‚ด ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  componentWillReceiveProps ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ์ƒ์„ฑ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐœ์ฒด๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” props๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๊ณ  ์ฝ”๋“œ์—์„œ this.props ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jimfb ๋Š” ๋‹ค์Œ

@me-andre ๋‹น์‹ ์ด ๋‹จ์ง€ ๋„์›€์„ ์ฃผ๋ ค๊ณ  ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋Œ€๋ฆฝ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์˜ ์–ธ์–ด๋ฅผ ์•ฝ๊ฐ„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ํ™˜์˜ํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•œ๋•Œ ๋ชจ๋‘ ๋‰ด๋น„์˜€์Šต๋‹ˆ๋‹ค. API/๋””์ž์ธ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์  ์ค‘ ์ผ๋ถ€๊ฐ€ ์ •ํ™•ํ•˜๋”๋ผ๋„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์ œ๋ฅผ +1ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ํ‘œ์‹œ์ด๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ๋ฌด์—‡์„/์™œ ์›ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ช… ์ฃผ๊ธฐ. ๋ฌธ์ œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ(๋ฌธ์„œ)๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถฉ๋ถ„ํžˆ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ React์˜ API์— ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ์—ฌ๊ธฐ์—์„œ ๋ถˆ๋งŒ/์งˆ๋ฌธ/์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์–ธ๊ธ‰ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ™˜์˜ํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ ๊ท€ํ•˜์™€์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค.

@jimfb ๋Š” ๋‹ค์Œ

@shea256 this.state.profileName != this.props.profileName์€ ๋‚ด๋ถ€ ์ƒํƒœ(๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๋‚ด์šฉ)๊ฐ€ ๋ถ€๋ชจ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋ Œ๋”๋งํ•˜๋„๋ก ์š”์ฒญํ•œ ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑฐ์˜ "๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ ์ค‘์ž…๋‹ˆ๋‹ค" ๋˜๋Š” "๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ตœ์‹  ์ƒํƒœ์ž…๋‹ˆ๋‹ค"์˜ ์ •์˜์ด๋ฏ€๋กœ ํ•ดํ‚น์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ "prop์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๊ณ  ์ฝœ๋ฐฑ์—์„œ setstate๋ฅผ ์ˆ˜ํ–‰"ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ณด๋‹ค ๋” ํ•ดํ‚น์€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@jimfb ๋Š” ๋‹ค์Œ

@shea256 ๋ถ„๋ช…ํžˆ ์ฃผ๊ธฐ๋กœ ์ธํ•ด ํ˜„์žฌ์˜ ์ˆ˜๋ช…

๋‚˜๋Š” ์ด๊ฒƒ์— ๋งค์šฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋„์›€์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. componentDidReceiveProps ๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ ์ด์œ ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์™€ ๋ถ„๋ช…ํžˆ ๊ฒŒ์‹œํ•œ 12๋ช… ์ด์ƒ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ณธ๋Šฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ๊ฐœ ๋” ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•จ). ์ด๋Š” API๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

@jimfb ๋Š” ๋‹ค์Œ

@me-andre๊ฐ€ ์—ฌ๊ธฐ์— ๋งž์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์€ ์‹ค์ œ๋กœ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹จ์ง€ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ http ์š”์ฒญ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ์ด์ „ === ๋‹ค์Œ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ง€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฐ ๊ฐ€์ •์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‚˜๋Š” ์ˆ˜ํ‘œ๋ฅผ ์ƒ๋žตํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์š”์ฒญ์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

@jimfb ๋Š” ๋‹ค์Œ

์ด๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์ด ์ด ์ƒˆ๋กœ์šด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์„ ์›ํ•˜๋Š” ๊ทผ๋ณธ ์›์ธ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด์œ /๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ๊ณผ ์•ฝ๊ฐ„ ์ž˜๋ชป ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

componentDidReceiveProps ๋Š” ๋‚ด๊ฐ€ ๊ฐ€์ง„ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ReactRouter ๋ฐ Flux ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋˜๋ฉด ๋‚ด ์ƒํƒœ๋ฅผ ์ƒ์ ์˜ ํ•ญ๋ชฉ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒ์ ์—์„œ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฉด ๋™์ผํ•œ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๊ฒฝ๋กœ์—์„œ ๋‹ค๋ฅธ ํ•ญ๋ชฉ ID๋กœ ์ด๋™ํ•˜์—ฌ ์†Œํ’ˆ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‚ด ์ƒ์ ์„ ๋‹ค์‹œ ์ฟผ๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒ์ ์˜ ์ด์ „ ํ•ญ๋ชฉ ์ƒํƒœ๋กœ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

ํ˜„์žฌ componentWillReceiveProps ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ updateItemState๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ props๊ฐ€ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ props๋ฅผ ๋‚ด ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

this.updateItemState( nextProps );

updateItemState( props ) {
    props = props || this.props;

    this.setState( {
        item: this.getItemState( props )
    } );
}

getItemState( props ) {
    props = props || this.props;

    return this.ItemStore.get( props.params[ this.paramName ] );
}

๋‹จ์ˆœํžˆ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

this.updateItemState();

updateItemState() {
    this.setState( {
        item: this.getItemState()
    } );
}

getItemState() {
    return this.ItemStore.get( this.props.params[ this.paramName ] );
}

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@kinnee-gl et al: ์—…๋ฐ์ดํŠธ ์™ธ์— ์ดˆ๊ธฐ ๋งˆ์šดํŠธ ํ›„์— componentDidUpdate๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ?

@aknnee-gl , Flux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ €์žฅ์†Œ์—์„œ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ƒํƒœ๋ฅผ ํ•œ๊ณณ์— ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Flux์˜ ๊ฒฝ์šฐ ๊ทธ ์žฅ์†Œ๋Š” ์ƒ์  ์ž์ฒด์ž…๋‹ˆ๋‹ค. ์ƒ์ ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‚ด๋ณด๋ƒˆ์„ ๋•Œ forceUpdate() ๊ทธ๋ฆฌ๊ณ  render() read() ์ƒ์ ์ž…๋‹ˆ๋‹ค.

"๋™์ผํ•œ ๊ฒฝ๋กœ์—์„œ ๋‹ค๋ฅธ ํ•ญ๋ชฉ ID๋กœ ์ด๋™ํ•˜์—ฌ ์†Œํ’ˆ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‚ด ์ƒ์ ์„ ๋‹ค์‹œ ์ฟผ๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒ์ ์˜ ์ด์ „ ํ•ญ๋ชฉ ์ƒํƒœ๋กœ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค."

์ ˆ๋Œ€.

์‚ดํŽด๋ณด์„ธ์š”: ์ƒ์ ์—์„œ ํŠน์ • ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๊ณ  ๋ Œ๋”๋งํ•  ํ•ญ๋ชฉ์€ props ์—์„œ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    var item = this.props.store.read(this.props.id);
    return <div>{item.name}</div>;

์ด๊ฒƒ์€ ๋‹น์‹ ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ ๊ทธ ์ด์ƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
Flux์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์Šคํ† ์–ด ๋ฐ”์ธ๋”ฉ/๋ฐ”์ธ๋”ฉ ํ•ด์ œ๋ฅผ ์œ„ํ•œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<FluxWrapper store={store} component={Component} id={this.props.routeParams.id} />

var FluxWrapper = React.createClass({
    componentWillMount() {
        this.props.store.addListener('change', this.onStoreChange);
    },
    componentWillUnmount() {
        this.props.store.removeListener('change', this.onStoreChange);
    },
    onStoreChange() {
        this.forceUpdate();
    },
    render() {
        var Component = this.props.component;
        return <Component {...this.props} />;
    }
});

var Component = React.createClass({
    render() {
        var item = this.props.store.read(this.props.id);
        return <div>{item.name}</div>;
    }
});

React๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž‘์•„ ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒ์ ์ด ๋ฌด๊ฑฐ์›Œ read() render() ๋งˆ๋‹ค ์ƒ์ ์„ FluxWrapper ์™€ ์œ ์‚ฌ)์ด๊ฑฐ๋‚˜ ์›๋ž˜ read() ๋ฉ”์„œ๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ์ค‘๊ฐ„ ํ”„๋ก์‹œ ์ €์žฅ์†Œ
์ด๊ฒƒ์„ ๊ตฌ์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ์ง€์…˜์ด ํ™•์žฅ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์ด๋‚˜ ํ™•์žฅ ๊ธฐ๋Šฅ๋ณด๋‹ค ์ปดํฌ์ง€์…˜์„ ์„ ํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ์— ๋ณต์žก์„ฑ์„ ๊ฐ€ํ•˜๋Š” ๋Œ€์‹  2๊ฐœ ์ด์ƒ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

@jimfb , ์ œ ์–ด์กฐ์— ๊ด€ํ•ด: ์ €๋Š” ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ •๊ธฐ์ ์œผ๋กœ ๋งํ•˜๊ธฐ ์—ฐ์Šต๋„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋” ์ž˜๋ชป๋œ ๋‹จ์–ด๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ •์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋“ค๋ฆฌ๋Š”์ง€ ๋Š๋ผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹. ๋ช…์‹ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. React์˜ ๋ชจ๋“  ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์„ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋ Œ๋”๋ง ๋ฉ”์„œ๋“œ์—์„œ props ๋ฐ state์—๋งŒ ์•ก์„ธ์Šคํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค). ๋ชจ๋“  Flux ์˜ˆ์ œ๋Š” ์ €์žฅ์†Œ์˜ ์„ค์ • ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@jimfb componentDidUpdate ์˜ ๋ฌธ์ œ์ ์€ props ๋ณ€๊ฒฝ ์ด์™ธ์˜ ๋‹ค๋ฅธ ์ด์œ ๋กœ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ setState๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@aknnee-gl componentWillReceiveProps ๋Š” ์†Œํ’ˆ ๋ณ€๊ฒฝ ์ด์™ธ์˜ ์ด์œ ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ(https://github.com/facebook/react/issues/3279#issuecomment-164713518 ์ฐธ์กฐ) ๋‹ค์Œ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. prop์ด ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ(์„ ํƒํ•œ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ๊ด€๊ณ„์—†์ด). ๋˜ํ•œ ์‹ค์ œ๋กœ ๋น„๋™๊ธฐ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋” ๊ธฐ๋Šฅ ๋งž์ฃ ?

@jimfb ์‚ฌ์‹ค, prop์ด ์ฐธ์กฐํ•˜๋Š” ์•„์ดํ…œ์ด ์ด๋ฏธ ์Šคํ† ์–ด์— ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„์ง ์Šคํ† ์–ด์— ์—†๋Š” ๊ฒฝ์šฐ ๋กœ๋”ฉ ํ™”๋ฉด์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๋ฒˆ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ๊ฒ ์–ด์š”.

@me-andre ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ์ƒ์ ์—์„œ ์ฝ๋Š” ๋ฐฉ์‹์ด ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํšจ์œจ์„ฑ์ด ๋–จ์–ด์งˆ๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. shouldComponentUpdate๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ธฐ๋Šฅ์„ ์žƒ๊ฒŒ ๋˜๋ฉฐ ์–ธ๊ธ‰ํ•œ ์ถ”๊ฐ€ FluxWrapper ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํ† ๋ก ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์„ธ ๋ฒˆ์งธ ์˜ต์…˜์„ ๋‹ค์‹œ ํ‘œ๋ฉดํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (1) API๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ›Œ๋ฅญํ•˜๊ณ , (2) componentDidReceiveProps๊ฐ€ ํ•„์š”ํ•˜๊ณ , (3) ๋” ๊ฐ„๋‹จํ•œ API๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(1)๊ณผ (2)์˜ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„์œผ๋กœ ๋…ผ์˜๋ฅผ ์ œํ•œํ•˜๊ธฐ๋ณด๋‹ค API๋ฅผ ๋” ์‹ฌ์ธต์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐํ•˜์—ฌ ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ์ œ๊ธฐ๋œ ๊ทผ๋ณธ์ ์ธ ์š”๊ตฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐํšŒ๋กœ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํ™”๋œ API๋Š” ๋‹ค์Œ ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(A) ์ฝ”๋“œ ๊ตฌ์กฐ ๋‹จ์ˆœํ™” / ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ
(B) props(์ž…๋ ฅ)๋ฅผ state(๋‚ด๋ถ€)์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€

(A)์˜ ์ฃผ๋œ ์ด์œ ๋Š” ๋‚ด๊ฐ€ ๋ถ€๊ฐ€๊ฐ€์น˜๊ฐ€ ์—†๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

componentWillMount() { this.actuallyCheckThePropsAndMaybeDoSomething(); }
componentWillReceiveProps(nextProps) { this.actuallyCheckThePropsAndMaybeDoSomething(nextProps); }

actuallyCheckThePropsAndMaybeDoSomething(props) {
  props = props || this.props;

  let relatedProps1 = _.pick(props, KEYS1);
  if (!shallowEqual(this.relatedProps1, relatedProps1) { // changed
   this.relatedProps1 = relatedProps1;

   // do something
  }

  let relatedProps2 = _.pick(props, KEYS2);
  if (!shallowEqual(this.relatedProps1, relatedProps2) { // changed
   this.relatedProps2 = relatedProps2;

   // do something else
  }
}

๋‚˜๋Š” ์˜คํžˆ๋ ค ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ฒ˜์Œ ๋Œ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ณ„๋„์˜ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

propsUpdated(prevProps) {
  if (!shallowEqual(_.pick(prevProps || {}, KEYS1), _.pick(this.props, KEYS1)) { // changed
   // do something
  }

  if (!shallowEqual(_.pick(prevProps || {}, KEYS2), _.pick(this.props, KEYS2)) { // changed
   // do something
  }
}

(B)์˜ ๊ฒฝ์šฐ componentDidUpdate์˜ ์ฃผ์š” ๋ฌธ์ œ์ ์€ props(inputs)์™€ (internal) state ๋ชจ๋‘์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด state๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ๊ฒฝ๋กœ๋Š” props๊ฐ€ ์™ธ๋ถ€์—์„œ ์ œ๊ณต๋˜๊ณ  ์ƒํƒœ๊ฐ€ ๋‚ด๋ถ€์—์„œ ์„ค์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌ๋ ์ˆ˜๋ก ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด componentDidUpdate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ updated(prevProps, prevState) (๋” ์ ์€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋” ์งง์€ ๋ช…๋ช…์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— componentDidUpdate์˜ ๋‹จ์ˆœํ™”๋œ ์ด๋ฆ„)์˜ ๋„ค ๋ฒˆ์งธ ๊ฐ€๋Šฅ์„ฑ์„ ์‹œ๋„/๊ณ ๋ คํ–ˆ์ง€๋งŒ ์ž ์žฌ์ ์ธ ์ค‘๋ณต ๋‘ ๋ฒˆ์งธ ๊ฐ€๋Šฅ์„ฑ์— ์•ฝ๊ฐ„ ๋ถˆ๋งŒ์กฑ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ํ˜ธ์ถœ๊ณผ ๊ทธ ๋…ผ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋งค์šฐ ๋…๋ฆฝ์ ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋””์ž์ธ ์›์น™๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ(๋” ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค!), propsUpdated ๋ฐ stateUpdated ๋ผ์ธ์— ๋”ฐ๋ฅธ ๊ฒƒ์ด ์ด ํ† ๋ก ์˜ ์ž ์žฌ์ ์ธ ์„ธ ๋ฒˆ์งธ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ?

@kmalakoff props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€/๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์‹คํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ•ญ์ƒ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(Javascript์—๋Š” ๊ฐ’ ์œ ํ˜•์ด ์—†๊ณ  ๊ฐ€๋ณ€์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—).

๊ทธ ์ ์—์„œ ์•„๋งˆ๋„ shouldComponentUpdate๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ propsDidChange๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๊ฐœ์˜ ๋ฌธ์ œ์ง€๋งŒ.

@jimfb ๋Š” ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•˜๋Š” ์–ธ์–ด ์ œํ•œ์ด ๋ฌด์—‡์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ

๋‚˜๋Š” ๊ทธ๊ฐ€ this.props === nextProps ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋‚ด์žฅ๋œ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์ด ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

{ a: 1 } === { a: 1 } ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๊ฐœ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ

var a = { a: 1 };
var b = a;
a === b

์‹ค์ œ๋กœ ๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— true๋ฅผ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์†์„ฑ์ด ๊ฐ™์€์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋งค์šฐ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— shouldComponentUpdate ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

@kmalakoff ์ด ์Šค๋ ˆ๋“œ๋ฅผ https://gist.github.com/jimfb/9ef9b46741efbb949744

TLDR: @akinnee-gl์˜ ์„ค๋ช…์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค(๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!). prop์œผ๋กœ ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— (์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„) ํ•ญ์ƒ ์žฌ๊ท€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์†Œํ•œ ์ˆ˜์ •์œผ๋กœ.

๊ทธ๋ž˜๋„ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฃผ์ œ๋กœ ์œ ์ง€ํ•ฉ์‹œ๋‹ค :P.

๋‘˜ ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ , API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ด ์•„๋‹Œ ์ด์œ ์— ๋Œ€ํ•ด ์•„์ง ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์š”์  ์— ์˜๊ฒฌ์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

๋” ๋„“์€ ๋ฒ”์œ„์˜ ์†”๋ฃจ์…˜์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๊ฑฐ๊ธฐ์— ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค!

@jimfb @calmdev ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์‹œ๋„ํ–ˆ๊ณ  ์ด์ œ componentDidReceiveProps ๊ฐ€ ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ์ถ”๊ฐ€๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์ด์œ ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋‹น์‹ ์˜ ๋ง์„ ๋ฏฟ์—ˆ์ง€๋งŒ ์ด์ œ๋Š” ์™œ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด ๊นจ๋‹ฌ์Œ์„ ์–ป์€ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์‹  ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

class ProfilePage extends Component {
  static propTypes = {
    fetchCurrentProfile: PropTypes.func.isRequired,
    currentProfile: PropTypes.object.isRequired
  }

  constructor(props) {
    super(props)
    this.state = { currentProfile: {} }
  }

  componentHasNewRouteParams(routeParams) {
    this.props.fetchCurrentProfile(routeParams.id)
  }

  componentWillMount() {
    this.componentHasNewRouteParams(this.props.routeParams)
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.routeParams.id !== this.props.routeParams.id) {
      this.componentHasNewRouteParams(nextProps.routeParams)
    }
    this.setState({
      currentProfile: nextProps.currentProfile
    })
  }

  render() {
    var profile = this.state.currentProfile
    return (
      <div>
        <h1>{ profile.name ? profile.name : null }</h1>
      </div>
    )
  }
}

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํƒ‘์žฌ๋˜๋ฉด ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉฐ ์™ธ๋ถ€ ์†Œ์Šค์—์„œ ํ”„๋กœํ•„์„ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ... ์™ธ๋ถ€ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” fetchCurrentProfile ํ•จ์ˆ˜( componentHasNewIdProp ๋ž˜ํ•‘๋จ)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ Redux์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๋Š” ์ด ์ž‘์—…์„ ์ˆ˜์‹ ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ ProfilePage ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ props๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ props๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์œผ๋ฏ€๋กœ componentWillReceiveProps ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” prop change ์ด๋ฒคํŠธ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค props(์žˆ๋Š” ๊ฒฝ์šฐ)๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ID๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ fetchCurrentProfile ๋‹ค์‹œ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒˆ ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก state.currentProfile ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— props.currentProfile ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ™•์ธํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ... ํ•œ ํ”„๋กœํ•„์—์„œ ๋‹ค๋ฅธ ํ”„๋กœํ•„๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ผ์šฐํ„ฐ๊ฐ€ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ  componentWillReceiveProps ํ•จ์ˆ˜๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. id ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ํ™•์ธํ•˜๊ณ  fetchCurrentProfile ๋‹ค์‹œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค( componentHasNewIdProp ).

์ƒˆ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋Œ์•„์™€์„œ redux ์ž‘์—…์„ ์ „๋‹ฌํ•˜๋ฉด currentProfile ์†Œํ’ˆ์ด ๋‹ค์‹œ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒˆ ๋ณด๊ธฐ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ์™€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒˆ props๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ ๋‹ค๋ฅธ ๋™์ž‘์ด ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ํ›„์ž์˜ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด props๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํŠน์ • props ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋Œ์ด์ผœ๋ณด๋ฉด ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์›ํ–ˆ๋˜ ๊ฒƒ์€ routeParams ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์œผ๋กœ ์›ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ˆ˜๋ช… ์ฃผ๊ธฐ, ์ž‘์—… ์˜ˆ์ œ ๋“ฑ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

๋„์™€์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ œ๊ฐ€ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ์•ž์œผ๋กœ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๊ฒƒ์ด ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@shea256 ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ์ƒˆ๋กœ์šด API ๊ด€์  ์—†์ด ํ•„์š”ํ•œ ๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ƒˆ๋กœ์šด API๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ๋ก€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://gist.github.com/jimfb/9ef9b46741efbb949744 ์—์„œ ๋” ๋งŽ์€ ์ƒ๊ฐ์„ ์š”์•ฝํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ์šฉ๊ตฌ๊ฐ€ ์ ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

class ProfilePage extends Component {
  static propTypes = {
    fetchCurrentProfile: PropTypes.func.isRequired,
    currentProfile: PropTypes.object.isRequired
  }
  state = {currentProfile: {}}; // not material to example (babel-stage-1)

  // called both on init and update
  willReceiveProps(nextProps) {
    if (!this.props || (this.props.routeParams.id !== nextProps.routeParams.id)
      nextProps.fetchCurrentProfile(nextProps.routeParams.id)
  }

  render() {
    var profile = this.props.currentProfile;
    return (
      <div>
        <h1>{ profile.name ? profile.name : null }</h1>
      </div>
    )
  }
}

๋‚ด๊ฐ€ ๊ณ ๋ ค๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ์•„์ด๋””์–ด๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ์™€ ์ƒ์šฉ๊ตฌ์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด API ํ‘œ๋ฉด์ ์„ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๊ธธ์„ ์—ด ์ˆ˜ ์žˆ์„ ๋•Œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•ด ๋‹ฌ๋ผ๋Š” ์ดˆ๊ธฐ ์š”์ฒญ์— ํ† ๋ก ์ด ๊ณ ์ • ๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ์˜ต์…˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค(๋‚ด ์„ ํ˜ธ๋„๋Š” receiveProps(prevProps)์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” this.props๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” prop ๊ด€๋ จ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ API ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ๋ชจ๋“  ์†Œํ’ˆ ๋ณ€๊ฒฝ. ์‚ฌ๋žŒ๋“ค์ด ๋” ๋‚˜์€ ๋ฐ ๋™์˜ํ•˜๋Š” ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ด๋ฉฐ(๋‚ด ์š”๊ตฌ/๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด!) ํ•ด๋‹น ์†”๋ฃจ์…˜์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•ด ์ข€ ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(API ์ œ๊ฑฐ, ES6์ด ๋„๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋“ฑ).

@aknnee-gl , ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž‘์€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ช‡ ๊ฐ€์ง€ ์ด์œ  ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ๋ฌด๊ฑฐ์šด ๊ตฌ์„ฑ ์š”์†Œ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

  1. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  2. ์–ด๋–ค ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ž˜ํ•‘ํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์ด ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ์บก์Šํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ Œ๋”์—์„œ ์Šคํ† ์–ด์—์„œ ์ฝ๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ท€ํ•˜์˜ ํ†ต์ง€์™€ ๊ด€๋ จํ•˜์—ฌ ์บ์‹ฑ์„ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์š”์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/me-andre/0ca8b80239cd4624e6fc

๊ฐœ์„ ๋œ API๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์›์น™/๋ชฉํ‘œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

(A) ์ฝ”๋“œ ๊ตฌ์กฐ ๋‹จ์ˆœํ™” / ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ
(B) props(์ž…๋ ฅ)๋ฅผ state(๋‚ด๋ถ€)์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€
(C) ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ Œ๋”๋ง์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฉ”์„œ๋“œ ํ—ˆ์šฉ
(D) ์ปดํฌ๋„ŒํŠธ ์„œ๋ธŒํด๋ž˜์‹ฑ์˜ ๊ฐ€์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”์†Œ๋“œ ๋ช…๋ช… ๋‹จ์ˆœํ™”
(E) ์ดˆ๊ธฐํ™”์™€ ๋ณ€๊ฒฝ ๋ชจ๋‘์— ๋Œ€ํ•ด props ๋ฉ”์†Œ๋“œ์˜ ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ์ค„์ž…๋‹ˆ๋‹ค.
(F) props ๋ฉ”์†Œ๋“œ์—๋Š” ์ตœ์‹  ๊ฐ’์ด ์žˆ๋Š” this.props๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์š”์ง€์— ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@kmalakoff ์š”์ง€์— ๋”ฐ๋ฅด๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ฆฌ์ง€ ๋ง™์‹œ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•˜๋ฉฐ ๋Œ€ํ™”๋ฅผ ์™„์ „ํ•œ API ์žฌ์„ค๊ณ„๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณ„์† ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ•˜์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฃผ์ œ๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

@kmalakoff ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋งŽ์€ ์š”์ ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (D)๋Š” https://github.com/reactjs/react-future/issues/40#issuecomment -142442124 ๋ฐ https://github.com/reactjs/react-future/issues/40#issuecomment ์— ์˜ํ•ด ๋‹ต๋ณ€๋ฉ๋‹ˆ๋‹ค. 153440651. ๊ทธ๊ฒƒ๋“ค์€ ๊ทธ ํ† ๋ก ์„ ํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ /์ „์ฒด๋ก ์  ๋””์ž์ธ/API ํ† ๋ก ์„ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋งค์ฒด๋Š” ์•„๋งˆ๋„ https://discuss.reactjs.org/ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jimfb ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ์š”์ ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ค์ œ๋กœ ์ด ๋ถ„์„ ๋ผ์ธ์ด ์ฃผ์ œ์—์„œ

์ œ ๋ง์„ ๋“ค์–ด์ฃผ์„ธ์š”... ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ ์ด ๋ฌธ์ œ ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ API๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ๊ถŒ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์ด ์ด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ์‹์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ์ด์œ ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, API ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋ถ„๋ฆฌํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ฌธ์ œ์˜ props์™€ ๊ด€๋ จ๋œ API ๊ฐœ์„ ๊ณผ ๊ด€๋ จ๋œ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„ ํƒ์ƒ‰์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kmalakoff ์Šค๋ ˆ๋“œ์˜ ์ฃผ์ œ๋Š” ์ œ๋ชฉ๊ณผ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ œ๋ชฉ์€ componentDidReceiveProps Please ์•„๋‹ˆ๋ผ lots of general ways to reduce boilerplate ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋Š” ํŠนํžˆ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•์˜ ๋„์ž…์„ ํ†ตํ•ด ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ์ด๋ฏธ ๋…ผ์˜๋˜๊ณ  ์žˆ๋Š” ์ถ”๊ฐ€ ์ฃผ์ œ(์˜ˆ: ๋ชจ๋“  ๊ธฐ๋Šฅ์˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ)๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ๊ทธ ๋…ผ์˜๋งŒ์œผ๋กœ๋„ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์š”์ ์€ ์†Œ์ค‘ํ•˜๋ฉฐ ํ† ๋ก ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. github ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹น๋ฉดํ•œ ์ฃผ์ œ์— ์ง‘์ค‘ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์˜ฎ๊ธฐ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ† ๋ก ์„ ์ถ”์ /๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ๊ธฐํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฃผ์ œ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

@jimfb ์‚ฌ๋žŒ๋“ค์ด componentDidReceiveProps ์š”๊ตฌํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ œ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ์ด์œ ๋Š” props ์™€ ๊ด€๋ จ๋œ ์ƒ์šฉ๊ตฌ ๋ฅผ

๋‹น์‹ ์€ ๋ฌธ์ œ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์š”์ฒญํ–ˆ๊ณ , ์ €๋Š” ์ด๊ฒƒ์„ ๋ฌธ์ œ๋กœ ์–ธ๊ธ‰ํ–ˆ๊ณ  ์œ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€(@shea256์— ์‘๋‹ต)๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ฃผ์ œ์™€ ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ทธ๋ฆฌ๊ณ  ๋‚ด ๊ด€์ ์—์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์ค‘์š”ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ.

์ผ๋ฐ˜์ ์ธ API ๋ฌธ์ œ/๊ฐœ์„  ์‚ฌํ•ญ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋ฅ˜ํ•˜๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค! :๋ˆˆ์ง“:

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

@kmalakoff , ok, ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋ ค๋ฉด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋‚˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•˜์œ„ ๋ถ„๋ฅ˜ํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์•ฑ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. React๋Š” ๋›ฐ์–ด๋‚œ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ์ฒด, ํ•จ์ˆ˜ ๋˜๋Š” ํด๋ž˜์Šค๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒํด๋ž˜์‹ฑ, ๋ฏน์Šค์ธ ๋˜๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@me-andre ์ด ๋ฌธ์ œ๊ฐ€ API ๊ฐœ์„ ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” API๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๋ฐ”๋žŒ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์ด‰์ง„ํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๋Œ€์•ˆ ํƒ์ƒ‰์„ ํ™•์‹คํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•˜์ง€๋งŒ API๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ก ์„ ์ œ๊ธฐํ•˜๋ ค๋ฉด ๊ฐœ์„ ๋œ API๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์‚ฌ๋ก€๋„ ๋งŒ๋“  ๋‹ค์Œ ํ˜„์žฌ API์™€ ๋น„๊ตํ•˜์—ฌ ํ‰๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ปค์Šคํ…€ ์Šˆํผํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ API๊ฐ€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ์ž…์ฆํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: API๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ API์— ๋‹ค์Œ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ์ˆ˜์ค€์˜ ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ ๋“ฑ) ๋˜๋Š” ๊ฐœ์„ ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ด์œ (์˜ˆ: API ๊ฐœ์„  ์˜ต์…˜์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ) ๋“ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API๊ฐ€ ๊ทธ ์ž์ฒด๋กœ ์ข‹์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

API๊ฐ€ ๊ธฐ๋ณธ ๋ฐ ๊ณตํ†ต ์ œ์–ด ํ๋ฆ„ ํŒจํ„ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์Šˆํผํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ API๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ์ฃผ์žฅ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šดํŠธํ•˜๊ธฐ ์ „์— componentWillReceiveProps ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ์‹ค์ œ๋กœ props๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ƒˆ๋กœ์šด props๋ฅผ ๋ฐ›์ง€ ๋ชปํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด props๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ๋งŒ(์ดˆ๊ธฐ prop ์ˆ˜์‹ ์ด ์•„๋‹Œ) ๋ฌด์–ธ๊ฐ€๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋ช…๋ฐฑํ•œ ๊ฒƒ์„ ๋†“์น  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์–‘ํ•œ ๋‹น์‚ฌ์ž์˜ ๊ด€์ ์„ ์กฐํ™”์‹œํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  componentWillReceiveNewProps ๊ฐ€ ์–ด๋–ค ๊ฒฝ์šฐ์— ์ค‘์š”ํ–ˆ๋‹ค๋ฉด ๋“ค์–ด์˜ค๋Š” ์†Œํ’ˆ์„ ํ™•์ธํ•˜์—ฌ ์ˆ˜์ •๋œ componentWillReceiveProps ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kmalakoff componentWillReceiveProps ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด API ๋‹จ์ˆœํ™”์— ๋Œ€ํ•œ ํ‘œ์ค€์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๊นŒ?

componentWillReceiveProps ๋งˆ์šดํŠธ ์‹œ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด componentDidReceiveProps ์š”๊ตฌํ•˜๋Š” ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์š”๊ตฌํ•˜๊ณ ์žˆ๋‹ค componentDidReceiveProps ๋Š” ์•ก์„ธ์Šค์— ์ž์‹ ์˜ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ผ๋‹ค ๋•Œ๋ฌธ์— this.props . ๋•Œ componentWillReceiveProps ํ˜ธ์ถœ๋˜๋ฉด nextProps ํ†ต๊ณผ๋˜์ง€๋งŒ, this.props ํ†ต๊ณผํ•˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์˜๋ฏธ, ์•„์ง ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ nextProps ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์œผ๋กœ componentWillReceiveProps , ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๋Œ€์‹ . ์šฐ๋ฆฌ๋Š” props = props || this.props ํ†ค๊ณผ ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์— props ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

@shea256 ์ข‹์€ ์ . ์ดˆ๊ธฐํ™”์™€ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ prop ์ƒ์šฉ๊ตฌ์˜ ๊ทผ๋ณธ ์›์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ทผ๋ณธ ์›์ธ์€ @kinnee-gl์ด ์ง€์ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์†Œํ’ˆ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์‹ค์ œ๋กœ prop ์ƒ์šฉ๊ตฌ๋ฅผ ๋” ์ค„์ด๋Š” ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ ค ์ค‘์ธ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„์„ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค(์˜ˆ: init ํ˜ธ์ถœ).

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์€ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค:

์ƒˆ ํ›„ํฌ ์ด์ „

componentWillMount() {
  this.setup(this.props.id);
}

componentWillReceiveProps(next) {
  this.setup(next.id);
}

setup(id) {
  UserActions.load(id);
}

New Hook ์ดํ›„(๊ฐœ์ •)

componentDidReceiveProps(prevProps) {
  UserActions.load(this.props.id);
}

๋˜๋Š” UserActions.load๊ฐ€ ํ˜„์žฌ ๋กœ๋“œ๋œ ID๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ:

componentDidReceiveProps(prevProps) {
  if (!prevProps || (prevProps.id !== this.props.id))
    UserActions.load(this.props.id);
}

@kmalakoff , ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ API ๊ฐœ์„ ์ด ์ง€๊ธˆ ๋‹น์žฅ ์ ˆ๋Œ€์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์‹ ๋งŒ์˜ ๊ตฌ์„ฑ ์š”์†Œ ๊ณต์žฅ์„ ๋งŒ๋“  ๋‹ค์Œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ƒ˜ํ”Œ๊ณผ ํ•จ๊ป˜ ์šฐ๋ฆฌ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ œ์•ˆ๊ณผ ๊ทผ๊ฑฐ๊ฐ€ ๋ฐฑ ๋ฐฐ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ง€์ ์—๋Š” ์ด๋ฏธ ์ ์ ˆํ•œ ์ฝœ๋ฐฑ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ง€์ /๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ์—์„œ ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ด๋ฏธํ„ฐ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ์— ํ˜ผํ•ฉํ•˜๊ณ  ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@shea256 , componentWillReceiveProps ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ์ „์— ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๊ทธ ๋‹น์‹œ this.props ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. componentWillReceiveProps ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋Š” ์ผ์€ this.props[propName] ์™€ newProps[propName] ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ์ „์— ๋ฉ”์„œ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด this.props ์กด์žฌ ์—ฌ๋ถ€๋„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ „์— props ๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์œผ๋ฉฐ state ์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

@kmalakoff , setup ๋˜๋Š” ์œ ์‚ฌํ•œ ํ•ดํ‚น์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ๋‘ ๋ฒˆ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. React์™€ ํ†ตํ•ฉ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋Œ€์‹  React ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ์—ฌ์ „ํžˆ ๋…ธ๋ ฅํ•˜๋Š” ์ด์œ ๋ฅผ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด ์ƒ˜ํ”Œ์ด ๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ์ง€์ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aknnee-gl , ์—…๋ฐ์ดํŠธ ์‹œ this.props ์— ์•ก์„ธ์Šคํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” render() ๋ผ๊ณ  ํ•˜๋Š” ๊ทธ๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. shouldComponentUpdate() ํ™•์ธํ•œ ํ›„์—๋„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ this.props !== newProps ๋˜๋Š” _.isEqual(this.props, newProps) ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
์ผ๋ถ€ ์„ค์ •์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ render() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

this.setup(this.props);
return this._render();

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด React ์ƒํƒœ๊ณ„์˜ ์ผ์„ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ๊ณ„์† ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@me-andre ์ด ๋ฌธ์ œ์˜ ์ „์ œ๋Š” ํ˜„์žฌ API๋กœ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ํ˜„์žฌ API๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ์ „์ œ๋Š” ํ˜„์žฌ React API๊ฐ€ ์ฐจ์„ ์ฑ…์ด๋ฉฐ ๊ฐœ์„ ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์ ์˜ API๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€์— ๋Œ€ํ•œ ์›์น™์„ ์ƒ๊ฐํ•ด ๋‚ธ๋‹ค๋ฉด(์œ„์—์„œ ์‹œ๋„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ) ํ˜„์žฌ React API๋Š” ์—ฌ๋Ÿฌ ์˜์—ญ์—์„œ ์ฐจ์„ ์ฑ…/๊ฒฐํ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ์ˆ˜์ค€ ๋ฒ”์œ„์—์„œ ์ ์ˆ˜๋ฅผ ๋งค๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ React API๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ณ , ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์—์„œ ๋…ผ์Ÿ์„ ์˜ฎ๊ธฐ๊ณ , React API๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ž ์žฌ์  ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๋…ผ์Ÿ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, ํ”„๋กœ๋•์…˜์— ๋งŽ์€ React ์•ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋ฒ” ์‚ฌ๋ก€๊ฐ€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ์ง„์ •ํ•œ ๋ชฉ์ ์— ๋Œ€ํ•œ ์‹ค์ œ ํ† ๋ก : React API๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•(์ด ๋ฌธ์ œ์—์„œ๋Š” ์†Œํ’ˆ ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ฐ ์ƒ์šฉ๊ตฌ๋กœ ์ œํ•œ๋จ).

React 1.0์€ ์ค‘๊ฐ„์ด ์•„๋‹Œ ์ƒ๋‹จ์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ฒ„์ „ ์ฆ๊ฐ€๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ 0.x ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐฐ์šด ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๋Šฅํ•œ ์ตœ์ƒ์˜ API๋ฅผ ์ฐพ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(์ฐธ๊ณ : ์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ API์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ API์— ๋Œ€ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ฐพ๊ณ /ํฌ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ๋งŒํผ ๊ท€ํ•˜์˜ ์˜ˆ์ œ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์˜๋„๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฝ๊ฐ„ ์ž˜๋ชป ์ •๋ ฌ๋จ)

์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ API์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ API์— ๋Œ€ํ•œ ๊ฐœ์„ ์„ ์ฐพ๊ณ /ํฌ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Œ€๋งŒํผ ๊ท€ํ•˜์˜ ์˜ˆ์ œ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค, API ๊ฐœ์„  ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์˜ค์…จ์ง€๋งŒ "React ๋ชจ๋ฒ” ์‚ฌ๋ก€"์—์„œ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ๋“ค์€ ์ตœ์•…์˜ ๊ด€ํ–‰์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ "๊ทธ๊ฒƒ์ด ๋ณ€ํ™”์˜ ์ด์œ ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์ด๊ฒƒ์ด ๋ณ€๊ฒฝ์˜ ์ด์œ ์ด์ง€๋งŒ React ์ฝ”๋“œ๋ฒ ์ด์Šค์—๋Š” ์—†์Šต๋‹ˆ๋‹ค.
React์™€ ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์ง€๋งŒ ์ ์ ˆํ•œ ์‚ฌ์šฉ๋ฒ• ์‡ผ์ผ€์ด์Šค๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ณ„์† ์ฃผ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฑด์„ค์ ์ธ ๋…ผ์Ÿ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ React API๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ธ ์ƒ์œ„ ์ˆ˜์ค€ API๋กœ ํ•˜์œ„ ์ˆ˜์ค€ API๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ. ๋งŽ์€ ํ›Œ๋ฅญํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด ์•„์ด๋””์–ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๊ณ„์† ๋งํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๊ณ  ์šฐ๋ฆฌ์™€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์œผ๋กœ ๊ธฐ์กด์˜ ๋ชป์ƒ๊ธด API๋ฅผ ํฌ์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๋” ์ข‹์•„์ง„ ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ๋†€๋ž์Šต๋‹ˆ๋‹ค.
๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ผ๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜์— React ์•ฑ์ด ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ ํ† ๋ก ์˜ ํ•œ ์ค„๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ ํ† ๋ก ์—์„œ ๋ฉ€์–ด์งˆ ๋ฟ์ž…๋‹ˆ๋‹ค.

API๋ฅผ ์„ค๊ณ„/์„ค๊ณ„ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋Š” ์ผ์€ ๋ฌธ์ œ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๊ฐ€์„ค์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์„ค์„ ์„ธ์šฐ๋Š” ์ด์œ ๋Š” ์ด์ƒ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ์ž์‹ ์„ ์ถ”์ƒํ™”ํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. "๋ฏธ๋ฆฌ" ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๋Ÿฐ ๊ฒฝํ—˜์ด ์žˆ๊ณ  ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ๋ณด์•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๋…ผ์Ÿ์„ "์‹ค์ œ" ๋ฐ "ํšจ๊ณผ์ ์ธ" ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. React ์ž์ฒด๋Š” ์‹ค์ œ ๋ฌธ์ œ์™€ ๋„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "hello world๋ฅผ 3์ค„๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•"๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

@me-andre ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋‹น์‹ ์˜ ์ฃผ์žฅ์ด ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฃผ์žฅ์˜ ํ•ต์‹ฌ์€ ํ˜„์žฌ React API ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ์ง‘๋‹จ์  ๊ฒฝํ—˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ๋‚˜์€ ์›์น™์„ ์ˆ˜๋ฆฝํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ๋ฐฉ์‹์œผ๋กœ API๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ ๋…๋‹จ์  ์†”๋ฃจ์…˜์„ ํฌํ•จํ•˜๋Š” ํ† ๋ก ์„ ์—ด๋ฉด ์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ณด๋‹ค ๋” ๋‚˜์€ React API๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์žก์œผ์„ธ์š”. ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์„ ๋•Œ ์šฐ๋ฆฌ์˜ ์›”๊ณ„๊ด€์— ์•ˆ์ฃผํ•˜์ง€ ๋ง™์‹œ๋‹ค!

props์— ๋Œ€ํ•œ ํ˜„์žฌ React API๋ฅผ ์–ด๋–ป๊ฒŒ ํ‰๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (๊ธ€์ž ๋“ฑ๊ธ‰์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค: F์—์„œ A+๊นŒ์ง€), ์™œ, A+ ๋ฏธ๋งŒ์ด๋ฉด ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@me-andre ์ˆœ์œ„์™€ ๋ถ„์„์„ ์ค€๋น„ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๋‚˜์š”? ํ˜„์žฌ API์˜ ๊ฐ•์ , ์•ฝ์  ๋ฐ ๊ธฐํšŒ๊ฐ€ ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

+1

+1 ์ œ๋ฐœ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ComponentDidReceiveProps๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

๋‚˜๋Š” 1๋…„ ์ „์— ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ๊ทธ ์ดํ›„๋กœ ๋งค์ผ React๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ API ์ฆ๊ฐ€๋ฅผ ์ •๋‹นํ™”ํ•˜๋Š” componentDidReceiveProps์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@AlexCppns ๋‹น์‹ ์ดํ•˜๋ ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@iammerrick , ์‚ฌ์‹ค ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. componentWillReceiveProps๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ์ž˜๋ชป ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ํ† ๋ก : https://github.com/facebook/react/issues/7678

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ช‡ ๋ฒˆ ๋งŒ๋‚ฌ๊ณ  ๊ฒฐ๊ตญ ํ•œ ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

componentWillReceiveProps(nextProps) {
  if (this.props.foo !== nextProps.foo) this.needsUpdate = true;
}
componentDidUpdate() {
  if (this.needsUpdate) {
    this.needsUpdate = false;
    // update the dom
  }
}

๋‚˜์˜์ง€ ์•Š์•„.

@brrigand , ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. componentDidUpdate() ๋‚ด์—์„œ ์†Œํ’ˆ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

componentDidUpdate(prevProps) {
    let needsUpdate = prevProps.foo !== this.props.foo;
    // ...whatever
}

๋˜ํ•œ ์†”๋ฃจ์…˜์€ shouldComponentUpdate() ์˜ํ•ด ์‰ฝ๊ฒŒ ์†์ƒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค ๋ฉ‹์ง€๋„ค์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@jimfb ์•„๋ž˜์— ๋™๊ธฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” componetDidReceiveProps ๊ฐ€ ์ด๊ฒƒ์— ์™„๋ฒฝํ–ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  componentDidMount() {
    this._selectAll()
  }

  componentDidUpdate(prevProps) {
    let shouldUpdateSelected = (prevProps.recordTypeFilter !== this.props.recordTypeFilter) ||
      (prevProps.statusFilter !== this.props.statusFilter) ||
      (prevProps.list !== this.props.list)

    if (shouldUpdateSelected) { this._selectAll() }
  }

  _selectAll() {
    this.setState({ selectedIds: this._getFilteredOrders().map((order) => ( order.id )) })
  }

  _getFilteredOrders() {
    let filteredOrders = this.props.list

    // recordTypeFilter
    let recordTypeFilter = this.props.recordTypeFilter
    filteredOrders = _.filter(filteredOrders, (order) => {
        // somelogic
    })

    // statusFilter
    let statusFilter = this.props.statusFilter
    filteredOrders = _.filter(filteredOrders, (order) => {
        // somelogic
    })

    return filteredOrders
  }

@chanakasan , ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—๋Š” ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ render() ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋‘˜์งธ, ์ฝ”๋“œ๊ฐ€ ์ผ๋ถ€ ์‚ฌ์šฉ์ž ์ง€์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ฝ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜์ง€ ๋ง๊ณ  ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์˜ˆ๋ฅผ ์ฝ์—ˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๊ฐ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ์ด๊ฒƒ์€ componentDidUpdate ์•„๋‹ˆ๋ผ componentWillReceiveProps ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. componentWillReceiveProps ์ „ํ™˜ํ•˜๋ฉด ๋™์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‘ ๋ฐฐ ์ ๊ฒŒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์„ ๋– ๋‚œ ์ง€ 1๋…„์ด ์ง€๋‚œ ํ›„์—๋„ DOM ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ฐ˜์‘์„ ์ œ์™ธํ•˜๊ณ ๋Š” componentDidUpdate ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฌ๋‚˜ this.state.selectedIds ๊ฐ€ ์‹ค์ œ๋กœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›„ํฌ๋ฅผ ์ „ํ˜€ ํ”ผํ•˜๊ณ  ๋ชจ๋“  ๋…ผ๋ฆฌ๋ฅผ render() ๋ฉ”์„œ๋“œ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ ๋น„์ €์žฅ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. ์ˆœ์ „ํžˆ ์†Œํ’ˆ์—์„œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @me-andre, ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋‹ต์žฅ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ํŽ˜์ด์ง€์˜ ํ† ๋ก ์„ ์ฝ์—ˆ๊ณ  ๊ทธ๊ฒƒ์— ์ฐธ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, componentDidReceiveProps ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ์ƒํ™ฉ์ด ์‹ ๋น„๋กœ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.
componentWillReceiveProps ์‚ฌ์šฉํ•œ๋‹ค๋ฉด your component would re-render twice as less ๋ผ๊ณ  ๋ง์”€ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์—ฌ์ „ํžˆ ๋ฏธ์Šคํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์ด์ „์— ์ œ์•ˆํ•œ ๋‘ ๊ฐ€์ง€๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. _selectAll() ์—์„œ ํ˜ธ์ถœ๋œ _getFilteredOrders() ํ•จ์ˆ˜์— newProps๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— componentWillReceiveProps๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. selectedIds ๋ฅผ ์ƒํƒœ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํŒŒ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์™„์ „ํ•œ ์˜ˆ ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ๋ดค์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ €๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋˜๋„๋ก ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ด ์˜ˆ๋ฅผ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@chanakasan , ์–ด์„œ, ์ด๊ฒƒ์€ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ „๋ถ€ ์ฝ๊ณ  ๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฌด๋ฃŒ๋กœ ๋„์™€์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. componentWillReceiveProps() ๋ฐ componentDidUpdate() ์ด์ „ ๋ฐ ๋‹ค์Œ ์†Œํ’ˆ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต์‹ React ๋ฌธ์„œ์—์„œ ๋ถ„๋ช…ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ฝ”๋“œ์˜ ์ „์ฒด ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ์—์„œ ์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ํ† ๊ธ€ํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ๋œ ID๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ ์—ฌ์ „ํžˆ componentWillReceiveProps() ๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ๋‘ ๋ฐฐ ์ ๊ฒŒ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. (์–ด์จŒ๋“  componentWillReceiveProps() ์ดํ›„์— ๋ Œ๋”๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— setState() ๋Š” ๋‹ค์Œ ๋ Œ๋”์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.)
  3. ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์กด์ค‘ํ•˜์‹ญ์‹œ์˜ค.

@me-andre ๋ฌธ์„œ์—์„œ ๋‹ค์Œ ์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ componentWillReceiveProps ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ ์„ ์ดํ•ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

this.setState()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด componentWillReceiveProps()๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ componentWillReceiveProps ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€ nextProps๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์กฐ์–ธ์„ ๋”ฐ๋ฅด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Btw, ๋‚ด ํ”„๋กœ๋•์…˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฌด๋ฃŒ๋กœ ๋„์™€์ฃผ๋ ค๋Š” ์˜๋„๋Š” ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. :). ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๊ณต๋ฐฑ์„ ์ฑ„์šฐ๋Š” ์ด์ „์˜ ์งง์€ ์˜ˆ๋ณด๋‹ค ๋” ์™„์ „ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ shouldComponentUpdate์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ
ํ•˜์ง€๋งŒ props๋ฅผ ๋ฐ›์€ ํ›„ ์ˆ˜๋™ ์Šคํฌ๋ฆฝํŠธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์‹  props๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด this.props๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— this.props๋ฅผ ์ƒˆ ์†Œํ’ˆ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ComponentDidMount ๋˜๋Š” ์ด๋ฅผ ์œ„ํ•œ ํ›„ํฌ๊ฐ€ ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ์š”? ๋•Œ๋กœ๋Š” React ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ: ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ๊ตฌ์„ฑ์š”์†Œ๋Š” ์ง€๋„ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” OpenLayer ์ง€๋„๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž์‹์ด ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์†Œํ’ˆ์„ ๋ฐ›๊ณ  React ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋‚ด์—์„œ ๋‹ค๋ฅธ ๊ณ„์‚ฐ๋„ ์ปค๋ฐ‹ํ•œ ํ›„์— ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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