January 12, 2021
์ด์ Vanilla JS + Redux ๋ก TODO ์ฑ์ ๋ง๋ค์ด ๋ณด์์ ๋, store ์์ ํ์ฌ์ state ๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋ฉ์๋๊ฐ ์์๋ค.
store.getState()
์ด์ Home.js ์ปดํฌ๋ํธ์์ ๋ฆฌํดํด ์ฃผ๋ ๋ถ๋ถ์์ ul ํ๊ทธ ์์๋ค store ๋ก๋ถํฐ state ๋ฅผ ๋ฐ์์ ๋ ๋ํ ์ ์๊ฒ ํด์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ค๋ฉด ๋จผ์ ํ์ฌ ๋ด ์ปดํฌ๋ํธ๋ค์ store ์ ์ฐ๊ฒฐํด์ผ ํ๋ค.
๊ทธ๊ฒ ๋ฐ๋ก connect ๋ผ๋ ๊ฒ์ธ๋ฐ, ๋์ components ๋ค์ store ์ ์ฐ๊ฒฐํ๊ฒ ํด ์ค๋ค.
connect ๋ ๋๊ฐ์ ์ธ์ (state, dispatch) ๋ฅผ ๊ฐ์ง๋ค. ๋ ์ค์ ๊ณ ๋ฅผ ์ ์์ด์ ์ด๋ค.
์ฐ๊ฒฐ์ ์ํด store ๋ก๋ถํฐ state ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๋ (getCurrentState) ํจ์๋ฅผ ๋ง๋ ๋ค.
ํจ์ ์ด๋ฆ์ โmapStateToPropsโ ๋ก ํ๋๊ฒ ๊ตญ๋ฃฐ์ด๋ผ ํ๋ค.
const mapStateToProps = (state, ownProps) => {}
Redux state ๋ก๋ถํฐ Component ์ props ๋ก์จ ์ ๋ฌํ๋ค๋ ์๋ฏธ๋ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋์ export default Home ์ ์๋์ ๊ฐ์ด ๊ณ ์น๋ค.
export default connect(mapStateToProps)(Home)
์ด์ Home ์ปดํฌ๋ํธ๋ store ์ ์ฐ๊ฒฐ ๋์๋ค.
import { connect } from 'react-redux'
Home.js ์์์ import ํด์ค๋ ๊ฒ์ ์์ง ๋ง์.
์ด์ store ์์ ํ์ฌ state ๋ฅผ ๊ฐ์ ธ์ค๋ mapStateToProps ๋ฅผ ๋ง์ ์์ฑํด๋ณธ๋ค.
store ์ reducer ์ ์ ์ํ ์ด๊ธฐ state ๋ฅผ ๋น ๋ฐฐ์ด์ด ์๋ state = [โinitValโ] ๋ก ์ง์ ํด ๋๊ณ
์ฝ์๋ก๊ทธ๋ฅผ ์ฐ์ด ๋ณด์๋ค.
const mapStateToProps = (state, ownProps) => {
console.log(state, ownProps)
}
๊ฐ๋ฐ์ ๋๊ตฌ์์๋,
["initVal"] {history: {โฆ}, location: {โฆ}, match: {โฆ}, staticContext: undefined}
mapStateToProps() in Connect(Home) must return a plain object. Instead received undefined.
์ด๋ฐ ๊ฒ ๋ฌ๋ค.
์ฒซ ์ค์์ ๋ณด๋ฉด firstArgument ๋ redux store ์์ ์จ ๋ํดํธ state ์ด๋ค. (initVal)
๋ ๋ฒ์งธ Argument ๋ ๋ด ์ปดํฌ๋ํธ์ props ๋ฅผ ์๋ฏธํ๋ค.
(App.js ์ react-router ์์ ๋ด๋ ค์ค props)
๊ทธ๋ ๋ค๋ ๋ป์ Home Component ์์ props ๋ก ๋ฐ์ ์ฌ ์ ์์์ ์๋ฏธํ๋ฏ๋ก,
์๋์ ๊ฐ์ด props ๋ฅผ Home ์ปดํฌ๋ํธ์ ์ธ์๋ก ๋ฐ์์ฌ ์ ์๊ฒ ํด์ฃผ๊ณ ,
console.log ๋ฅผ ์ฐ์ ์ ์๊ฒ ํด๋ณด์๋ค.
const Home = (props) => {
console.log(props);
// ! ์ฌ๊ธฐ์ props ๋ก ๋ฐ์์๋ค. App.js ์ react-router ๋ก๋ถํฐ!
... ์ดํ ์ค๋ต ...
๋งจ ์๋์ must return a plain object. ๋ ์์ง ํจ์ ๋ด์์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ์ง ์์ ์๊ธฐ๋ ์ค๋ฅ์ด๋ค.
๊ทธ๋์,
const mapStateToProps = (state, ownProps) => {
return { happy: true }
}
๋ฅผ ํด๋ณด๋, ์์ ์ฝ์๋ก๊ทธ์์ ์๋์ ๊ฐ์ props ๋ฅผ ์ฐ๋๋ค.
{history: {โฆ}, location: {โฆ}, match: {โฆ}, staticContext: undefined, happy: true, โฆ}
{ happy: true } ๊ฐ props ๋ก ์ถ๊ฐ ๋์ด ์๋ค.
why? connect() ๋ Home ์ผ๋ก ๋ณด๋ด๋ props ์ ์ถ๊ฐ ๋ ์ ์๋๋ก ํ์ฉํด ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌด์์ ๋ฆฌํดํ๊ฒ ํ๋ ๋์ Home component ์ props ์ ์ถ๊ฐ ๋ ๊ฒ์ด๋ค.
์ด์ store ์ state ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด mapStateToProps ๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ฒด๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
const getCurrentState = state => {
return { toDos: state } // ์ฌ๊ธฐ์ ownProps ๋ ํ์์์ด์ ์ง์ ๋ค.
}
์ด์ , store ์ state ๋ฅผ ๋ฐ์์ค๊ณ ์๋ค.. ์์..