์ด๋ฏธ์ง ๋ฐ์ดํฐ (URL, ํฌ๊ธฐ)๋ฅผ ํค๋ ๊ตฌ์ฑ ์์๋ก ์ ๋ฌํ๋ ํค๋ ์ปจํ ์ด๋๊ฐ ์์ต๋๋ค.
@connect(state => ({
header: state.header
}))
export default class HeaderContainer extends Component {
/// pass props.header data to child Header which renders image.
}
๊ทธ๋ฐ ๋ค์ ํค๋ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ํค๋ ์์ ์ ํธ์ถํด์ผํ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ์ํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ ๋ง ์คํํฉ๋๋ค. Afaik ๋ค์๊ณผ ๊ฐ์ดํด์ผํฉ๋๋ค.
const { dispatch } = this.props
const actions = bindActionCreators(headerActions, dispatch)
๋ฌธ์ ๋ this.props.dispatch๋ @connect ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ ๋ฒ์งธ ๊ตฌ์ฑ ์์๋ ํค๋ ์ํ์ ์ ํ ๊ด์ฌ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ connect๋ฅผ ์ฌ์ฉํด์ผํฉ๋๊น, ์๋๋ฉด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ ์ ๋ฐ์ธ๋ฉ ํ ์ ์์ต๋๊น? ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด @connect ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ชป๋ ๊ฒ
"์ฌ๋ฐ๋ฅธ"๋ฐฉ๋ฒ์ธ์ง ํ์คํ์ง ์์ง๋ง ์ปจํ
์คํธ๋ฅผ ํตํด ์์ ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Connector
๊ตฌ์ฑ ์์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/gaearon/react-redux/blob/master/src/components/createConnector.js
๋๋ ๋น์ ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค. @connect๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์๋ฒฝํ๊ฒ ์ก์ธ์คํ๊ณ ์์ต๋๋ค. @connect๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ตฌ์ฑ ์์์์ ์์ ์ ๋ฐ์ธ๋ฉ / ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
dispatch
ํจ์๋ ์์ ์ ๋ฉ์๋์
๋๋ค. ๊ตฌ์ฑ ์์์ ํ์ํ์ง๋ง @connect
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด ์ปจํ
์คํธ๋ฅผ ํตํด ์ ์ฅ์์ ์ก์ธ์คํ๊ณ ๋์คํจ์น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
class MyComponent extends Compoenent {
static contextTypes = {
store: React.PropTypes.object.isRequired,
}
render() {
const { dispatch } = this.context.store
const actions = bindActionCreators(headerActions, dispatch)
}
}
์์ ๊ตฌ์ฑ ์์์์ ๋์คํจ์น๋ฅผ โโ์ ๋ฌํ๊ฑฐ๋ ์ด๋ฏธ ๋์คํจ์น์ ๋ฐ์ธ๋ฉ ๋ ์์ ์ ์ ๋ฌํด์ผํฉ๋๋ค. ๊ทธ๊ฒ์ด _the_ ๋ด๊ฐ ๋ฏฟ๋ ๋ฐฉ์์ ๋๋ค. ์ปจํ ์คํธ๋ ์๋ํ์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
์ค๋ช ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ด์ ์ดํด๊ฐ๋๋ค.
dispatch
๋ฅผ ํด๋น ๊ตฌ์ฑ ์์์ ์๋์ผ๋ก ์ํ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
๋๋์ด ๋ฌธ์ ์ ๋ํด ์ฝ๊ฐ ์์ํดํฉ๋๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด, ์ปดํฌ๋ํธ์ props๋ฅผ ํตํด dispatch
์ฌ์ฉํ๊ฑฐ๋ (ํด๋น ์ปดํฌ๋ํธ์์ ์ก์
์ ๋์คํจ์น ํ ์ ์๋๋ก) ์ด๋ฏธ dispatch
๋ฐ์ธ๋ฉ ๋ ์ก์
์์ฑ์์๊ฒ ์ ๊ณตํด์ผํฉ๋๋ค. ๋ถ๋ชจ ๊ตฌ์ฑ ์์. ๊ทธ๋ฌ๋ ๋ ์๋ฃจ์
๋ชจ๋ ํด๋น props๋ฅผ ํตํด ๋์คํจ์น๋ฅผ โโ์ฌ์ฉํ ์ ์๋๋ก connect
ed ์ธ ์์ ๊ตฌ์ฑ ์์๊ฐ ์์ด์ผํฉ๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ dispatch
์ ์์กด์ฑ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ์ฎ๊ธฐ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ connect
ed ๋ถ๋ชจ๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒํ ๊น์?
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ฑ ์์์ ๊น์ ๊ณ์ธต ๊ตฌ์กฐ์ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
Router
AppContainer
...
...
...
TheComponentThatNeedDispatch
๋ถ๋ชจ๊ฐ redux ์ํ์ ์ฐ๊ฒฐํ ํ์๊ฐ ์๋ค๋ฉด?
connect
์ฌ์ฉ์ ๋ถ์์ฉ์ผ๋ก ๊ตฌ์ฑ ์์์ ๋์คํจ์น๋ฅผ โโ์ฌ์ฉํ ์์๊ฒ๋๋ฉด ๋ถ๋ชจ๊ฐ connect
์ด๋๋๋กํ๋ ๊ฒ์ด ์ ์ ์กฐ๊ฑด ์ธ ์ํฉ์ ๋์ด๊ฒ๋ฉ๋๋ค. dispatch
์์
์ ์ํ ํ ์ ์์ต๋๋ค. dispatch
์์
์ ๋ํ ๊ตฌ์ฑ ์์์ ๊ธฐ๋ฅ๊ณผ redux ์ํ์์ ์ฝ๊ธฐ ์ํด connect
๋ฅผ ์ฌ์ฉํด์ผํ๋ ํ์์ฑ ์ฌ์ด์ ์ด๋ค ์๊ด ๊ด๊ณ๊ฐ ์์ด์ผํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค.
๊ตฌ์ฑ ์์ ์ปจํ
์คํธ ( store.dispatch
๋ฅผ ํตํด)์์ ์ฌ์ ํ dispatch
์ก์ธ์ค ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ...
๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
๊ฐ์ฌ!
์ก์ ์ ๋์คํจ์นํ๋ ์ปดํฌ๋ํธ์ ๋ฅ๋ ฅ๊ณผ redux ์ํ์์ ์ฝ๊ธฐ ์ํด connect๋ฅผ ์ฌ์ฉํด์ผํ๋ ํ์์ฑ ์ฌ์ด์ ์ด๋ค ์๊ด ๊ด๊ณ๊ฐ ์์ด์ผํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค.
์ ์ด์ํด? connect
์ ๋จ์ํ "Redux ์ํ์ ์ผ๋ถ์ ์ฐ๊ฒฐ"์ด ์๋๋ผ "Redux์ ์ฐ๊ฒฐ"์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ตฌ์ฑ ์์ ์์ฒด ๋๋ ์์ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ฅผ dispatch
ํ ์ ์์ผ๋ ค๋ฉด Redux์ connect()
ed๊ฐ ์์ด์ผํฉ๋๋ค.
ํ์ฌ React Redux API๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ฅผ ์ ํํ์ง ์๊ณ Redux์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ํธ๋ฆฌํ์ง ์์ต๋๋ค. connect(state => ({}))(MyComponent)
(๋น ๊ฐ์ฒด ๋ฐํ)์ ๊ฐ์ ๊ฒ์ ์์ฑํด์ผํฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ dispatch
์ผ๋ฅ ์๋ฏผ์ด๋๋ ๋์ฒด API ๋ฅผ dispatch
"์ก๊ธฐ์ํ API๋ฅผ ์ถ๊ฐ ํ ๊ณํ ์ธ ์ด์ ์
๋๋ค.
์ด๊ฒ ๋ง์ด ๋ผ?
์ฐ๊ฒฐ์ "Redux ์ํ์ ์ผ๋ถ์ ์ฐ๊ฒฐ"์ด ์๋๋ผ "Redux์ ์ฐ๊ฒฐ"์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค.
์ด์ ์์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค :).
์๋ก์ด API ์ฌ์ฉ์ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. Redux๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ๋ณตํฉ๋๋ค!
https://github.com/gaearon/react-redux/releases/tag/v0.5.0 ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค
๋ฉ์ง๋ค์!
@gaearon ์๋ Dan์ ์ค์ฒฉ ๋ ๊ตฌ์ฑ ์์์ ํจ๊ป bindActionCreators๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํ์ ์ค ์ ์์ต๋๋ค.
"AddProduct"-redux์ ์ฐ๊ฒฐ๋จ (์๋ ์ฐธ์กฐ)
__ "์ ํ ๋ชฉ๋ก"
____ "ProductView".
ProductView๊ฐ ๋์คํจ์น ํ ์ ์๊ธฐ๋ฅผ ์ํ์ง๋ง ๋ง์คํฐ "์ ํ ์ถ๊ฐ"์๋ง ๋ค์์ด ์์ต๋๋ค.
function appState(state) {
return {...};
}
export default connect(appState)(AddProduct)
์ค์ฒฉ ๋ ๊ตฌ์ฑ ์์๋ connect()
ํ๊ฑฐ๋ dispatch
๋ฅผ ์ํ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค ๋, ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. redux๋ ์ ๋ง ์ข์ํฉ๋๋ค!
๋ด๊ฐ ํ ์ ์๋ค๋ฉด ๋ ๋ค๋ฅธ ์ง๋ฌธ :
๊ฐ์๊ธฐ ๋ด๋ถ์์ ์๋ฒ API ๊ฒ์ ์์ฒญ์ ๋ฐฐ์น ํ ์ ์์ต๋๊น?
๋ฐ์ดํฐ๋ฒ ์ด์ค (mongodb)์ POSTํ๋ฉด ํญ๋ชฉ์ด redux ์ํ์์ ์ํ๋ "_id"๋ฅผ ์ป์ต๋๋ค. ๋์คํจ์น๋ฅผ โโPOST ์์ฒญ์ ๋ํ ์ฝ๋ฐฑ์ผ๋ก ๋ฐฐ์นํด์ผํฉ๋๊น?
๊ฐ์ฌํฉ๋๋ค
๊ฐ์๊ธฐ ๋ด๋ถ์์ ์๋ฒ API ๊ฒ์ ์์ฒญ์ ๋ฐฐ์น ํ ์ ์์ต๋๊น?
ํ์คํ ์๋๋๋ค. ๊ฐ์๊ธฐ๋ ๋ถ์์ฉ์ด์๋ ์์ํ ๊ธฐ๋ฅ์ด์ด์ผํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค (mongodb)์ POSTํ๋ฉด ํญ๋ชฉ์ด redux ์ํ์์ ์ํ๋ "_id"๋ฅผ ์ป์ต๋๋ค. ๋์คํจ์น๋ฅผ โโPOST ์์ฒญ์ ๋ํ ์ฝ๋ฐฑ์ผ๋ก ๋ฐฐ์นํด์ผํฉ๋๊น?
์.
์ด ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค : http://rackt.github.io/redux/docs/advanced/AsyncActions.html
๊ฐ์ฌํฉ๋๋ค Dan, ์ ์๋ํฉ๋๋ค (y)
์๋ฒ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ ๊ฒฝ์ฐ
์คํ ์ด์์ ๋น๋๊ธฐ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ๊ฑด๋ ๋ฐ๊ณ ์๋ฒ์์ ์ํ ํ ์ ์์ต๋๊น?
์๋ฒ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ ์ํ์์ ์คํ ์ด์์ ๋น๋๊ธฐ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ๊ฑด๋ ๋ฐ๊ณ ์๋ฒ์์ ์ํ ํ ์ ์์ต๋๊น?
์๋ฒ์ ์ ์ฅ์๋ฅผ ๋ง๋ค๊ณ ๋น๋๊ธฐ ์์
์ด ์๋ฃ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค์ ๋ ๋๋ง ํ ์ ์์ต๋๋ค.
http://rackt.github.io/redux/docs/recipes/ServerRendering.html ์ฐธ์กฐ
๋๋ ์๋ง๋ ์ค์ํ ๊ฒ์ ๋์น๊ณ ์์ง๋ง ์ฑ ์ด๊ธฐํ ์ค์ ๋ชจ๋ ์ก์ ์์ฑ์์๊ฒ ๋ถ๋ถ์ ์ผ๋ก ๋์คํจ์น๋ฅผ โโ์ ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ฌ๋ฉด ๋์คํจ์น์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ์ด๋์์๋ ์ ํ๋ฅผ ๊ฑธ ์ ์์ต๋๋ค.
@mpoisot : ์ฑ ์์์ ์ ์ฌ์ ์ธ ์ก์ ์์ฑ์๋ฅผ ์๊ณ , ๊ฐ์ ธ์ค๊ณ , ๋ฐ์ธ๋ฉํ๊ณ , ๋ฐฐํฌํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฌด์๋ณด๋ค๋ ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ์ํฉ์์๋ ๋์์ด๋์ง ์์ต๋๋ค.
@markerikson createStore
ํธ์ถ ํ ์ ์๋๋ก app init์ ๋ชจ๋ ๊ฐ์๊ธฐ๋ฅผ ์ด๋ฏธ ์๊ณ ์์ด์ผํฉ๋๋ค. ๋ค์ ์ค์์ bindAllActionCreators(store.dispatch)
์ ํํ๋ ๊ฒ์ ์์ํฉ๋๋ค.
์ฌ์ค, ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ฝ๊ฐ ๋ ๋ง์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ฐ๋ ค๋๋ค๋ฉด ์ด๋ฐ ์์ผ๋กํ์ง ๋ง์ญ์์ค. ๋๋ ๊ฐ์๊ธฐ ์ธํธ (๊ฐ์๊ธฐ + ์ก์ ์ ์์ + ์ ํ๊ธฐ)๋ฅผ ๋ ์๊ณ ์ง์ค๋ ๋ฒ๋ค๋ก ๋๋๋๋ค. ๋๋ ์ผ๋ถ ์ก์ ์ ์์ ๋ง ๋ฌถ์ต๋๋ค.
์ด ์์ ์ ๋ํ ๋์ฐํ ์ฑ๋ฅ ์ ํ๊ฐ ์์ต๋๊น? ์๋๋ฉด ์ด๋ป๊ฒ ๋ ์ฝ๋ฉ ์ง์ฅ์ผ๋ก๊ฐ๋ ๋์ฐํ ๊ธธ๋ก ์ด์ด์ง๊น์?
@mpoisot : ๋ด๊ฐ ์๊ฐํ ์์๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๊ทธ๋ฌ๋ ํ ์คํธ ๊ฐ๋ฅ์ฑ๊ณผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ ์ ํํฉ๋๋ค.
connect
์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ ์ข
์์ฑ ์ฃผ์
๋ฐฉ์์ด ์ ์ฉ๋ฉ๋๋ค. "์ผ๋ฐ"๊ตฌ์ฑ ์์๋ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์ํ์ผ๋ก ์ ๊ณต๋๊ณ ์์์ ์๊ณ ํ์์ ๋ฐ๋ผ ํด๋น ํจ์๋ฅผ ํธ์ถํด์ผํฉ๋๋ค. ์ผ๋ถ ์์ ๊ตฌ์ฑ ์์ ๋๋ ์ฌ์ ๋ฐ์ธ๋ฉ ๋ ์์
์์ฑ์์ ์ํด ์ง์ ์ ๋ฌ ๋ ์ฝ๋ฐฑ์ธ์ง ์ฌ๋ถ๋ ์ค์ ๋ก ์ค์ํ์ง ์์ต๋๋ค. ์ฆ, ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋จํ๊ฒ ์ฌ์ฌ์ฉ ํ ์ ์๊ณ ํ
์คํธ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ์์ ์ ์ง์ ๊ฐ์ ธ ์ค๋ ๊ฒ๊ณผ ๊ฐ์ ์์
์ ์ํํ๋ฉด ๊ตฌ์ฑ ์์๊ฐ ํด๋น ํน์ ์์ ์ธ์คํด์ค ๋ฐ ๊ตฌํ์ ์ฐ๊ฒฐ๋๋ฏ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค (Redux FAQ : http://redux.js.org/docs/faq/). StoreSetup.html # store-setup-multiple-stores). ๋ด๊ฐ ๋น์ ์ด ์ ํํ ๋ฌด์์ ์๊ตฌํ๋์ง ์ดํดํ๋ค๋ฉด, ๊ทธ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ ์ง์ ๊ฐ์ ธ์ค๊ณ ์ฐธ์กฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ํฉ์
๋๋ค.
์ ์ข์ ์ , ์ก์ ํฌ๋ฆฌ์์ดํฐ์ ๋์คํจ์น๋ฅผ โโ๋ถ๋ถ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ ์คํ ์ด๋ฅผ ์ฑ๊ธ ํค์ผ๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ ์ด์ ๋ฅผ ์์ ๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ Dan Abramov๊ฐ ์๋ฒ ์ธก ๋ ๋๋ง (๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ ๋ ์ฌ์ฉํ์ง ์์ ๊ฒ)์ผ๋ก ์ธํด ์ฑ๊ธ ํค ์คํ ์ด๊ฐ ๋์ด์ ์ฐํธ๋ฆฌ๊ณ ์๋ค๊ณ ๋งํ์ง๋ง ์ด์ํ๊ฒ๋ ๊ทธ๋ ํ ์คํธ์ ๋ํด ์ธ๊ธํ์ง ์์์ต๋๋ค (๋ชจ๋๊ฐํด์ผ ํ ์ผ ๋๋ ์ ์ด๋ ํ์ง ์๋ ๊ฒ์ ๋ํด ๊ธฐ๋ถ์ด ๋์๋ค).
์ด๋ค ์ ์์ ํ
์คํธ๋ฅผ ์ํด ์ ์ฅ์๋ฅผ ๋ค๋ฅธ ์ ์ฅ์๋ก ์
๋ฐ์ดํธ ํ ์์๋ ์ ์ฅ์ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ์คํ ์ด ์์ฒด๋ฅผ ์ง์ ๋ด๋ณด๋ด๋ ๋์ StoreSingleton.getStore()
๋ฅผ ํตํด ๋ฐํํ๊ณ StoreSingleton.setStore()
๋ฅผ ํตํด ํ์ฌ ์คํ ์ด๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ๋ฐ๋ผ์ ํ
์คํธ ์ธก๋ฉด์์ ๋จ์ผ ์ ์ฅ์ ์ธ์คํด์ค์ ๋ฌถ์ด์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ค๋ ๋ ์๋ฒ ํ๊ฒฝ์์ ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
@mpoisot ๋ฐฉ๊ธ Provider / connect๊ฐ ์ํํ๋ ์์ ์ ์ค๋ช ํ์ต๋๋ค. ;)
์ธ์ ๊ฐ ๋์คํจ์น (๋๋ ์ฌ์ ๋ฐ์ธ๋ฉ ๋ ์์ )๊ฐ ํ์ํ "๋ฉ์ฒญํ"๊ตฌ์ฑ ์์๊ฐ ์ข ์ข ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ๊ทธ๋ฅผ ์ฐ๊ฒฐ๋ก ๊ฐ์ธ๊ฑฐ๋ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์์์ ๋ฌผ๊ฑด์ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ํ๊ฒฌ์ ํผํ๊ธฐ ์ํด ๋ง์ ๋ฐฐ์ ๋ฐ ์ ๋ฌ ์ํ์ฒ๋ผ ๋๊ปด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. mapStateToProps ()์ ๊ฒฝ์ฐ Provider / connect ()๋ก ๋๋ผ์ด ์ฑ๋ฅ ํฅ์์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ์ฒญํ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ฉด ๋ ๋์ ์์์ ๊ตฌ์ฑ ์์์ ๋์คํจ์น ๋ ผ๋ฆฌ๋ฅผ ์ถ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋์ด ์๋๋ฆฌ์ค๋ฅผ ์ถฉ๋ถํ ์ฌ๋ฌ ๋ฒ ์ณ์ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ต์ "์ธ์ ๊ฐ ์๋ฒ ์ธก ๋ ๋๋ง์ ํ ์ ์๋๋ก"์ ๋๋ค. (๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํ์ญ์์ค).
ํ์ฌ connect()
๋ Provider
์ ์์ ์์ dispatch
๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง๋ง ํฅํ์๋ ๋ณ๊ฒฝ ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ค React ๊ตฌ์ฑ ์์๊ฐ ์คํ์ค์ธ ์์
์ ์์ค์ธ์ง ์๋ ค์ฃผ๋ ๊ฐ๋ฐ ๋๊ตฌ์์ ํตํฉ๊ณผ ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ๋๋ ๋๊ตฐ๊ฐ๊ฐ ์ปจํ
์คํธ์์ ์คํ ์ด๋ฅผ ๊ฐ์ ธ ์์ ์ด๋ป๊ฒ ๋ ํฅ์์ํจ ๋ค์ ํฅ์๋ ์คํ ์ด๋ฅผ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์ ๋ฌํ์ฌ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์คํ ์ด๋ฅผ ํฅ์์ํค๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ก์
์ ์์๋ฅผ ์ฑ๊ธ ํค ์คํ ์ด์ ๋ฐ์ธ๋ฉํ๋ค๋ฉด ์ ์ฌ์ ์ผ๋ก ์๋ชป๋ dispatch
ํธ์ถ ํ ์ ์์ต๋๋ค.
๋ค, ์ ๊ฐ ๋ณธ "๊ตฌ์ฑ ์์ / ์บก์ํ ๋ ์ํ"์คํ ์ค ์ผ๋ถ๋ ์ ํํ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด ์์ด๋์ด์ ๋ฉ์ง ์ ์ ๋ํผ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ ํ this.context.store
์ก๊ณ ํ์์ ๋ฐ๋ผ dispatch
๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ ๋ณ๊ฒฝ๋ ์ฌํญ์ ์ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค.
๋๋ ์ด๊ฒ์ ์์ชฝ์ ์์๋ค-
๋ด ๊ธฐ๋ณธ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ ์ฅ์๋ฅผ ์ฑ๊ธ ํค์ผ๋ก ์ทจ๊ธํ๊ณ ์ ์ญ ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ getStore()
ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ฒ ์ธก ๋ ๋๋ง์ ์ฌ์ฉํ์ง ์์ต๋๋ค. connect
๋ํด mapStateToProps
Provider
๋ฐ connect
๋ฅผ ๊ณ์ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ฉด์ ์ ๋ ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ ๋ด์ ์ฌ๋ฌ ์์น์ ์คํ ์ด ( @jimbolla ๋ฐ @markerikson ์ธ๊ธ)๋ฅผ ๋ํํ๋ ์คํ์ฉ ์ฑ์ ๊ตฌ์ถํ์ผ๋ฉฐ dispatch
๋ฐ getState
์ฆ, context
๋๋ props
๋ฅผ ํตํด ์ฑ ์ ์ฒด์ ์ฐ๊ฒฐ๋์ด์ผํ๋ฉฐ ์ฑ๊ธ ํค์ด ๋ ์ ์์ต๋๋ค.
๋ฌ์ฑํ๊ณ ์ถ์ ๊ฒ์ ๋ฐ๋ผ ์ฑ๊ธ ํค ์คํ ์ด๊ฐ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก๋ ์ฒ์ฒํ ๋ฉ์ด์ง๊ณ ์์ต๋๋ค.
๋ค. ๋น์ ์ ํ์คํ ์์ ์ ์ ๊ทผ ๊ฐ๋ฅํ ์ฑ๊ธ ํค์ผ๋ก ์ทจ๊ธ ํ ์ ์์ง๋ง, ๊ทธ๊ฒ์ ๋น์ ์ ์ ํํ๊ณ , ๊ด์ฉ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ผ๋ฉฐ, ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๋ํ ์ค์ง์ ์ธ ์ด์ ์ ๋ณด์ง ๋ชปํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ์ข์ ํผ๋๋ฐฑ์ ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์์ ํฌ์ฅ์ ๋ณด์ฌ์ฃผ๋ ๋งํฌ๋ฅผ ๊ฒ์ ํ ์ ์์ต๋๊น?
๋ฟก๋ฟก
๋ค์์ dispatch
๋ํ์ด ์ ์ฉ ํ ์์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ Dan์ ์๊ฒฌ ์ค ํ๋์
๋๋ค.
https://github.com/reactjs/redux/issues/822#issuecomment -145271384
๋๊ธฐ๊ฐ ๋ฌด์์ธ์ง ๋ ์ ์ดํดํ๊ธฐ ์ํด ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ์ด์ผ ํ ์๋ ์์ต๋๋ค.
ํนํ dispatch
์ด ์ด๋ป๊ฒ ๋ํ๋๋์ง ํ์ธํ์ญ์์ค (๊ฐ์กฐ ํ์ํ์ต๋๋ค).
์ ์ฌํ ํผ๋์ ์ง๋ฉด ํ์ฌ์ด ์ด์ ๊ฒ์๋ฌผ์ ๋ฉ์นํ์ฌ ์ฐ๊ฒฐํ์ง ์๊ณ ์กฐ์น๋ฅผ ์ทจํ๊ณ ์ถ์ต๋๋ค.
export default class App extends Component {
...
componentDidMount() {
//registering event listener
BackgroundGeolocation.on('location', this.onLocation, this.onError);
}
onLocation(location) {
//wishing to dispatch an action to update variable in store
}
render() {
return (
<Provider store={store}>
<AlertProvider>
<MainNavigator screenProps={{ isConnected: this.state.isConnected }} />
</AlertProvider>
</Provider>
);
}
}
๋ด๊ฐ ์ดํด ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ ์ฅ์๋ฅผ Provider
๋ก ๊ตฌ์ฑํ๊ณ ์ ๋ฌํ๋ ์ค์ด๋ฏ๋ก์ด ๊ตฌ์ฑ ์์์ ์ ์ฅ์์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. onLocation
์ด๋ฒคํธ์์ ์ก์
์ ์ด๋ป๊ฒ ์ ๋ฌํ ์ ์์ต๋๊น?
@isaaclem : ๊ธ์, ๊ทธ ํน์ ํ ๊ฒฝ์ฐ์, ๋น์ ์ ์์ ์ ๋ํ ์ฐธ์กฐ๋ฅผ _do_ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ง์ store.dispatch(someAction)
ํธ์ถ ํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ต์
์ ์ผ๋ถ ๊ตฌ์ฑ ์์ _inside_ <Provider>
๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์น ์ ๋ณด ๋์์ ์ํํ๊ณ ์ฐ๊ฒฐ๋ ์ ์๋๋ก ๊ตฌ์ฑ ์์ ๊ตฌ์กฐ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
dispatch
๋ฅผ ํด๋น ๊ตฌ์ฑ ์์์ ์๋์ผ๋ก ์ํ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.