{
type: 'INCREMENT',
payload: number
}
type: 'DECREMENT'
}
여기 예시로 만든 action 객체는 값을 더해주는 increment, 그리고 decrement라는 action 객체를 만드는 방법이다. type은 이 action종류이고 그 외의 값들은 마음대로 넣어줄 수 있다. increment같은 경우에는 payload라는 숫자를 넣어줘 추가하는 값을 정해주었다. 그리고 이 형식은 이 다음인 action Creator 와 연결되어 있다.
export const increment = (number) => {
return {
type: 'INCREMENT',
payload: number
}
}
export const decrement = () => {
return {
type: 'DECREMENT'
}
}
현재 이 코드를 보면 화살표 함수로 action을 리턴한다. 화살표가 아니어도 된다.
const counterReducer = (state = 0, action) => {
switch(action.type){
case 'INCREMENT':
return state + action.payload
case 'DECREMENT':
return state -1
default:
return state;
}
}
export default counterReducer;
위 코드를 보면, 0이라는 state에 increment와 decrement action 을 적용해 increment 일 때는 payload를, decrement일때는 그냥 -1을 해준다. 가져와서 적용하는 것은 App.js 에서 해준다. action의 type을 보고 increment일때, decrement 일때를 나눠서 기능을 구현한다.
import React from 'react';
import './App.css';
import {useSelector, useDispatch} from 'react-redux';
import {increment} from './actions'
import {decrement} from './actions'
function App() {
const counter = useSelector(state => state.counter);
const isLogged = useSelector(state => state.isLogged);
const dispatch = useDispatch();
return (
<div className="App">
<h1>Counter {counter}</h1>
<button onClick={() => dispatch(increment(5))}>+</button>
<button onClick={() => dispatch(decrement())}>-</button>
{isLogged ? <h3>Valuable Information I shouldn't see</h3> : ""}
</div>
);
}
export default App;
리덕스는 한 어플당 하나의 스토어를 만다는데 스토어 안에는 현재의 앱 상태, 리듀서와 추가적으로 몇가지 내장 함수들이 있다.
위 코드를 보면 import를 통해 필요한 action creator를 가져오고 또 useSelector와 useDispatch라는 리액트 리덕스의 내장 기능들을 가져온다. Dispatch 는 액션을 파라미터로 전달한다.
useSelector는 state에 추가한 counter라는 값을 가져올 수 있게 한다. 이후 dispatch를 실행해 그 counter에 값을 수정하는 것이다.
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import {createStore} from 'redux';
import allReducers from './reducers'
import {Provider} from 'react-redux';
const store = createStore(
allReducers,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>
, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();