CSS 프레임워크
→ 일반적인 웹 디자인을 추상화하고 개발자가 웹 앱에서 디자인을 더 쉽게 구현할 수 있도록 하는 코드 라이브러리
→ 사용할 준비가 된 CSS 스타일시트 컬렉션
React를 위한 CSS 프레임워크 종류로는
1. Material UI
2. React Bootstrap
3. Semantic UI
4. Ant Design
5. Materialize
··· 등이 있는데, 이 중에서 John Ahn님의 노드 리액트 기초 강의에서는 Ant Design을 사용한다.
↓참고 사이트
Ant Design을 사용하기 위해서는 client directory에서 npm install antd --save를 하고 client 폴더에 있는 index.js에 Ant Design의 stylesheet를 import하는 코드를 추가하면 된다.
// client/index.js
import 'antd/dist/antd.css';
그리고 스타일을 적용하기 위해서는 위 참고 사이트에 들어가서 사이트 상단에 있는 Components 메뉴를 선택하고 원하는 component의 코드를 복사해서 사용하면 된다.
(스타일 적용은 추후에 개발하면서 진행)
Redux
→ 상태 관리 라이브러리
일단 여기서 상태(State)라는 것에 대해 알아보자.
React에는 Props와 State가 있는데, 이 둘을 비교해 보면..
Props
1. Properties를 줄인 말
2. 컴포넌트 간 데이터를 주고받을 때 사용
3. 부모에서 자식 컴포넌트로만 보낼 수 있음
4. 부모 컴포넌트에게 받은 값을 자식 컴포넌트에서 변경할 수 없음
//자식 컴포넌트
<ChatMessages
//부모로부터 messages와 member라는 데이터를 전달 받음
messages = {messages}
currentMember = {member}
>
State
1. 부모-자식 컴포넌트가 아닌 컴포넌트 내에서의 데이터 전달에 사용
2. 값을 변경할 수 있고, 변경하면 리렌더링 됨
state = {
message: '',
attachFile: undefined,
openMenu: false
}
다음 이미지를 보면 알 수 있듯이 Redux를 사용하면 모든 컴포넌트는 저장소에서 state를 가져온다.
그리고 변경된 컴포넌트는 저장소에 변경된 state를 dispatch하여 다른 컴포넌트가 이 변경된 state를 가져올 수 있다.
Redux는 단일 방향(unidirectional) 데이터 흐름을 가진다.
Action
→ 무슨 일이 일어났는지(상태) 설명하는 객체(object)
// 42번 article을 like했다는 의미
{ type: 'LIKE_ARTICLE', acticleId: 42 }
//이름이 Mary이고 id가 3인 유저를 가져오는데 성공했다는 의미
{ type: 'FETCH_USER_SUCCESS', response: { id: 3, name: 'Mary' } }
//text를 TODO 리스트에 추가했다는 의미
{ type: 'ADD_TODO', text: 'Read the Redux docs.' }
// →Mary가 42번 Article을 like했다
Reducer
→ 어떻게 변화했는지 설명하는 함수(function)
→ 이전 state와 action object를 받은 후에 next state를 return한다.
(previousState, action) => nextState
Store
→ State tree 전체를 감싼다. (모든 state를 관리)
→ 메소드를 가진 객체(object)이고, 클래스가 아니다.
→ state는 dispatch를 통한 Action으로 변경할 수 있다.
이제 본격적으로 Redux를 설치하고 설정해보자.
먼저 Redux의 4가지 dependency를 client directory에서 다운받아야 한다.
1. redux 2. react-redux 3. redux-promise 4. redux-thunk
(npm install redux react-redux redux-promise redux-thunk --save를 입력하면 4가지를 한 번에 다운받을 수 있다.)
이 4가지 중에서 3번과 4번은 redux middleware다.
이 middleware가 필요한 이유는, 기본 redux 저장소(store)는 객체의 Action만 받을 수 있는데 저장소에 항상 객체 형식의 Action이 들어오는 것은 아니고 promise, function 형식으로 들어올 때도 있기 때문이다.
redux-thunk는 dispatch에 function의 형식을 받게 하고, redux-promise는 promise의 형식을 받게 한다.
설치가 완료되면 다음 코드를 통해 App에다가 redux를 연결시켜줘야한다.
// server/index.js
import { Provider } from react-redux;
import { applyMiddleware, createStore } from 'redux';
import promiseMiddleware from 'redux-promise';
import ReduxThunk from 'redux-thunk';
import Reducer from './_reducers';
const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk) (createStore)
//기존에 있던 코드에서 수정
ReactDOM.render(
<Provider
store ={createStoreWithMiddleware(Reducer,
window.__REDUX_DEVTOOLS_EXTENSION__ &&
window.__REDUX_DEVTOOLS_EXTENSION__()
)}>
<App />
</Provider>,
document.getElementById('root')
);
REDUX_DEVTOOLS_EXTENSION을 사용하기 위해서는 Redux DevTools를 다운받아야 한다.
↓ 다운로드 링크
https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en
// _reducers/index.js
import { combineReducers } from 'redux';
//import user from './user_reducer';
//import comment from './comment_reducer';
const rootReducer = combineReducers({
//user,
//comment
})
export default rootReducer;
Combine Reducer를 사용하여 Root Reducer에서 User Reducer, Post Reducer, Comment Reducer 등과 같이 다양한 Reducer들을 하나로 합쳐준다.
mapStateToProps()
Redux 저장소(store)에 대한 업데이트를 반영하고 component에 props로 병합하기 위해 Redux 패턴에서 사용된다.
↓참고 사이트
https://dev.to/terrythreatt/what-is-mapstatetoprops-in-redux-427
'Study > React & Node.js' 카테고리의 다른 글
노드 리액트 기초 - 7th Day (2) (0) | 2021.08.01 |
---|---|
노드 리액트 기초 - 7th Day (1) (0) | 2021.07.30 |
노드 리액트 기초 - 5th Day (0) | 2021.04.02 |
노드 리액트 기초 - 4th Day (2) | 2021.04.02 |
노드 리액트 기초 - 3rd Day (0) | 2021.04.02 |