๋๋ ๊ฒธ์ํ๊ฒ 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๋ฅผ ์ฐ๊ฒฐํ์ง ์๊ณ ํ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์ 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 , ์ฌ๋ฌ ๊ฐ์ง ์์ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ ๊ฒ์ด ๋ช ๊ฐ์ง ์ด์ ๋๋ฌธ์ ๋ช ๊ฐ์ง ๋ฌด๊ฑฐ์ด ๊ตฌ์ฑ ์์๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
๊ฐ ๋ ๋์์ ์คํ ์ด์์ ์ฝ๋ ๊ฒ์ด ๋นํจ์จ์ ์ผ ์ ์๋ค๋ ๊ทํ์ ํต์ง์ ๊ด๋ จํ์ฌ ์บ์ฑ์ ์ํ ๋ฏธ๋ค์จ์ด ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธฐ๋ณธ ์์ด๋์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ง๋ฅผ ๋ง๋ค์์ต๋๋ค. 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);
}
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()
๋ฉ์๋๊ฐ ์์ต๋๋ค.
๋์งธ, ์ฝ๋๊ฐ ์ผ๋ถ ์ฌ์ฉ์ ์ง์ ๋น์ฆ๋์ค ๋
ผ๋ฆฌ์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ ์ฝ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค. ์ฃผ์ ํ์ง ๋ง๊ณ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ์ง ๋ง๊ณ ์ค๋ช
ํ์ญ์์ค.
๊ทธ๋ฌ๋ ๊ทํ์ ์๋ฅผ ์ฝ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์๊ฐ์ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค.
componentDidUpdate
์๋๋ผ componentWillReceiveProps
์ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค. componentWillReceiveProps
์ ํํ๋ฉด ๋์ผํ ๋
ผ๋ฆฌ๋ฅผ ์ ์งํ๋ฉด์ ๊ตฌ์ฑ ์์๊ฐ ๋ ๋ฐฐ ์ ๊ฒ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ์ด ํ ๋ก ์ ๋ ๋ ์ง 1๋
์ด ์ง๋ ํ์๋ DOM ๋ณ๊ฒฝ์ ๋ํ ๋ฐ์์ ์ ์ธํ๊ณ ๋ componentDidUpdate
๋ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ ํ ์์ต๋๋ค.this.state.selectedIds
๊ฐ ์ค์ ๋ก ์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํํฌ๋ฅผ ์ ํ ํผํ๊ณ ๋ชจ๋ ๋
ผ๋ฆฌ๋ฅผ render()
๋ฉ์๋๋ก ์ด๋ํ๊ฑฐ๋ ์ํ ๋น์ ์ฅ ๊ตฌ์ฑ ์์๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ด ํจ์ฌ ์ข์ต๋๋ค. ์์ ํ ์ํ์์ ๊ณ์ฐ๋ฉ๋๋ค.์๋ ํ์ธ์ @me-andre, ์๊ฐ์ ๋ด์ด ๋ต์ฅ์ ๋ณด๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ด ํ์ด์ง์ ํ ๋ก ์ ์ฝ์๊ณ ๊ทธ๊ฒ์ ์ฐธ์ฌํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์, componentDidReceiveProps
๋ ํ์ํ์ง ์์ง๋ง ์ด๊ฒ์ด ์์ผ๋ฉด ์ํฉ์ด ์ ๋น๋ก์ ๋ณด์
๋๋ค.
componentWillReceiveProps
์ฌ์ฉํ๋ค๋ฉด your component would re-render twice as less
๋ผ๊ณ ๋ง์ํ์
จ์ต๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ์ฌ์ ํ ๋ฏธ์คํฐ๋ฆฌ์
๋๋ค.
์ด์ ์ ์ ์ํ ๋ ๊ฐ์ง๋ฅผ ์๊ฐํ๊ณ ์๋ํ์ง๋ง ์คํจํ์ต๋๋ค.
_selectAll()
์์ ํธ์ถ๋ _getFilteredOrders()
ํจ์์ newProps๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ componentWillReceiveProps๊ฐ ์๋ํ์ง ์์ต๋๋ค.selectedIds
๋ฅผ ์ํ์ ์ ์ฅํ์ง ์๊ณ ํ์์ํค๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์์์ต๋๋ค.๋ฐฉ๊ธ ๋ด ์ฌ์ฉ ์ฌ๋ก์์ ์์ ํ ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ต๋ํ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ๋ดค์ต๋๋ค.
๋น์ ์ด ๋ณผ ์ ์๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ ๋ฅผ ๊ฐ๋ฆฌ์ผ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ด๊ฒ์ ์ ๋๋ก ์ดํดํ ์ ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๋์์ด ๋๋๋ก ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์ด ์๋ฅผ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
@chanakasan , ์ด์, ์ด๊ฒ์ ํ๋ก๋์ ์ฝ๋์ฒ๋ผ ๋ณด์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ ๋ถ ์ฝ๊ณ ๋น์ ์ ํ๋ก์ ํธ๋ฅผ ๋ฌด๋ฃ๋ก ๋์์ฃผ์ง ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ ์๋ ค์ค ์ ์์ต๋๋ค.
componentWillReceiveProps()
๋ฐ componentDidUpdate()
์ด์ ๋ฐ ๋ค์ ์ํ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ ๊ณต์ React ๋ฌธ์์์ ๋ถ๋ช
ํ ์ ์ ์์ต๋๋ค.componentWillReceiveProps()
๋ ๋ค์ ๋ ๋๋ง์ ๋ ๋ฐฐ ์ ๊ฒ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. (์ด์จ๋ componentWillReceiveProps()
์ดํ์ ๋ ๋๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ setState()
๋ ๋ค์ ๋ ๋์ ์ํ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.)@me-andre ๋ฌธ์์์ ๋ค์ ์ค์ ์ฌ์ฉํ์ฌ componentWillReceiveProps
์ ๋ํ ๊ทํ์ ์์ ์ ์ดํดํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
this.setState()๋ฅผ ํธ์ถํ๋ฉด componentWillReceiveProps()๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ componentWillReceiveProps
๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ nextProps๋ฅผ ํจ์์ ์ ๋ฌํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
๋๋ ๋น์ ์ ์กฐ์ธ์ ๋ฐ๋ฅด๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
Btw, ๋ด ํ๋ก๋์ ํ๋ก์ ํธ๋ฅผ ๋ฌด๋ฃ๋ก ๋์์ฃผ๋ ค๋ ์๋๋ ์๋์์ต๋๋ค. :). ๋ด ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๊ณต๋ฐฑ์ ์ฑ์ฐ๋ ์ด์ ์ ์งง์ ์๋ณด๋ค ๋ ์์ ํ ์์ ๋๋ค.
์ด๊ฒ์ shouldComponentUpdate์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ตฌ์ฑ ์์ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ ๋ค์ ๋ ๋๋งํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ
ํ์ง๋ง props๋ฅผ ๋ฐ์ ํ ์๋ ์คํฌ๋ฆฝํธ ์์
์ ์ํํ๊ธฐ ์ํด ์ต์ props๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด this.props๊ฐ ํ์ํฉ๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํ๋ ๊ธฐ๋ฅ์ ์คํํ๊ธฐ ์ ์ this.props๋ฅผ ์ ์ํ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
ComponentDidMount ๋๋ ์ด๋ฅผ ์ํ ํํฌ๊ฐ ์์ผ๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ์์? ๋๋ก๋ React ์๋ช ์ฃผ๊ธฐ์ ์์กดํ์ง ์๋ ๋ค๋ฅธ ๊ณ์ฐ์ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์: ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ ์์ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ํ์ ๊ตฌ์ฑ์์๋ ์ง๋ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๊ธฐ๋ฅ์ด ์๋ OpenLayer ์ง๋๋ฅผ ๋ ๋๋งํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์์ด ๋ถ๋ชจ๋ก๋ถํฐ ์ํ์ ๋ฐ๊ณ React ์๋ช ์ฃผ๊ธฐ ๋ด์์ ๋ค๋ฅธ ๊ณ์ฐ๋ ์ปค๋ฐํ ํ์ ๋ฐ์ํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@syranide ๋ฌธ์ ๋ ์ค์ ์ด ์ํ๋ ํ์๋ก ํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๊ณ , ์ํ๋ ํ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๋๋ค... ๊ฒฐ๊ตญ ์ ์ฒด ๊ตฌ์ฑ ์์๊ฐ ์ํ์ ๋๋ฌ์ธ๊ณ ์์ต๋๋ค.