Redux๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ์ ์ํ ์์ธก ๊ฐ๋ฅํ ์ํ ์ปจํ ์ด๋์ด๋ค.
Redux๋ ์ฐ๋ฆฌ๊ฐ ์ผ๊ด์ ์ผ๋ก ๋์ํ๊ณ , ์๋ก ๋ค๋ฅธ ํ๊ฒฝ(์๋ฒ, ํด๋ผ์ด์ธํธ)์์ ์๋ํ๊ณ , ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฑ์ ์์ฑํ๋๋ก ๋์์ค๋ค.
Redux๋ ๋ฆฌ์กํธ๋ง์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋๋ค. React ๋ฟ๋ง ์๋๋ผ Vue์๋ ์ ๊ฒฐํฉ๋๋ฉฐ, ๋ํ ์์ JS์๋ ๊ฒฐํฉ์ด ๋๋ค.
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.1/redux.js"></script>
Redux๋ state ๊ฐ์ฒด์์ ์ค์ ์ง์ค์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ ์ค์ฌ์ค๋ค.
state ๊ฐ์ฒด๋ ์ธ๋ถ์์ ์ง์ ์ ์ผ๋ก ์ ์ดํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, state์ ๊ฐ์ด ๋ณํ๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
let store = Redux.createStore(reducer);
function reducer(state, action) { }
๐ฆ ์์ฑ ์ ์ฃผ์ํ ์ : ๊ธฐ์กด์ state ๊ฐ์ ๋ณ๊ฒฝํ์ฌ return ํ์ง ๋ง๊ณ , ๊ธฐ์กด์ state๋ฅผ ๋ณต์ฌํ์ฌ ๋ณต์ฌ๋ณธ์ ๋ณ๊ฒฝํ์ฌ return ํ๋ค.
๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋๋ Object.assign({}, state, ... )
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ ์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฐ๋์ ๋น๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ถํฐ๋ ๋น๊ฐ์ฒด์ ๋ณต์ ํ ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ฃผ๋ฉด ๋๋ค.
store.dispatch({type:'CHANGE_COLOR'});
function red() { ... ์ค๋ต ... } store.subscribe(red);
render์ ์ฐ๋ฆฌ๊ฐ '์งค' ์ฝ๋์ด๋ค. render์ store์ ์ธ๋ถ์ ์์นํด ์๊ณ , state์๊ฒ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ผ๋ getState๋ฅผ ํตํด state์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , dispatch๋ฅผ ํตํด ๊ฐ์ ๋ณ๊ฒฝ ์ํค๊ณ , subscribe๋ฅผ ํตํด ๊ฐฑ์ ํ๋ค.
๐ render์์ state ๊ฐ์ ๊ฐ์ ธ์ค๊ณ , innerHTML์ ํตํด state ๊ฐ์ ์ด์ฉํด ์น ํ์ด์ง๋ฅผ ์์ฑํ๋ค.
let state = store.getState();
document.querySelector("#").innerHTML = ~