yarn add react-router-dom
yarn add firebase
yarn add redux redux-logger react-redux
Redux 설정
1. redux 를 이용하기 위해 Provider 의 아래에 위치.
// ./index.js
import { Provider } from 'react-redux';
...
ReactDOM.render(
<Provider>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>,
document.getElementById('root')
);
2. redux Folder 를 생성한다.
3. root.reducer.js 를 생성한다.
4. user Folder 를 생성한다.
5. user.reducer.js 를 생성한다.
// ./redux/user/user.reducer.js
// default value 를 설정.
const INITIAL_STATE = {
currentUser: null
}
/*
reducer 에서는 state 와 action 을 parameter 로 사용한다.
state 에는 현재의 state (current state) 를 담고 있다.
action 은 action 의 type 과 값을 담고 있는 payload 를 포함하고 있다.
*/
const userReducer = (state = INITIAL_STATE, action) => {
switch(action.type) {
case 'SET_CURRENT_USER':
return {
...state,
currentUser: action.payload
}
default:
return state;
}
}
export default userReducer;
6. root.reducer 에 user reducer 를 포함시킨다.
// ./redux/root.reducer.js
import { combineReducers } from 'redux';
import userReducer from './user/user.reducer';
// redux 내의 state 는 하나의 큰 json object 다.
// 생성한 Reducer 를 combineReducers 를 이용하여 관리한다.
export default combineReducers({
user: userReducer
});
7. store 를 생성하여 reducer 를 담는다.
// ./redux/store.js
import { createStore, applyMiddleware} from 'redux';
// redux code 디버깅시 유용한 middleware
import logger from 'redux-logger';
import rootReducer from './root.reducer';
// 사용할 middleware 를 등록
const middlewares = [logger];
// store 생성
const store = createStore(rootReducer, applyMiddleware(...middlewares));
export default store;
8. redux 의 Provider 에 store 정보를 설정한다.
// ./index.js
...
import store from './redux/store';
...
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>,
document.getElementById('root')
);
9. 이제 action 을 생성한다.
// ./redux/user/user.action.js
export const setCurrentUser = user => {
return ({
type: 'SET_CURRENT_USER',
payload: user
});
}
Redux 의 사용.
1. Redux 에 연결한다.
// ./App.js
...
import { connect } from 'react-redux';
...
// connect(mapStateToProps, mapDispatchToProps)(Component)
// 초기에는 전달할 mapStateToProps state 값이 없으므로 null 을 전달
export default connect(null, )(App);
2. action 을 Reducer 와 연결할 수 있도록 dispatch 에 action 을 넘겨준다.
// ./App.js
...
import { setCurrentUser } from './redux/user/user.actions';
...
class App extends React.Component {
...
something() {
setCurrentUser({
currentUser : {
id: snapShot.id,
...snapShot.data()
}
});
}
...
}
const mapDispatchToProps = dispatch => ({
setCurrentUser: user => dispatch(setCurrentUser(user))
})
//connect(mapStateToProps, mapDispatchToProps)(Component)
export default connect(null, mapDispatchToProps)(App);
3. 위 component 를 사용하는 상위 component 의 parameter 를 전달하는 부분을 삭제한다.
// ./App.js
<Header currentUser={this.state.currentUser} />
// =>
<Header />
4. 사용할 component 에서 redux 연결하기 위해 react-redux 의 connect 를 추가한다.
// state 를 사용할 component
import { connect } from 'react-redux';
...
const Header = ({ currentUser }) => {
return (
...
);
}
// 이름은 아무래도 상관없지만 mapStateToProps 이 redux code 표준.
// argument 로 사용되는 state 가 root reducer 의 state 다.
const mapStateToProps = (state) => ({
currentUser : state.user.currentUser
});
// 처음에는 root reducer 의 user state 가 없으므로 null 일 것이다.
export default connect(mapStateToProps)(Header);
Site 구축 연습 중에 정리차원의 지극히 개인적인 내용입니다.
행복한 고수되셔요.
woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
반응형
'Web > React' 카테고리의 다른 글
[Web/React] React info ... (0) | 2020.01.29 |
---|---|
[React] npm packages and Database info in blog site (0) | 2019.12.19 |
[React] React 정리 (0) | 2018.02.19 |