- notion 워크스페이스 만들기를 vue 에서 react로...
react는 사용자 인터페이스를 생성하기 위한 라이브러리 react 구성에 필요한 기능만 포함 일반적으로 react-dom, react-native등이 추가로 요구됨
import React from "react";
react용 DOM 및 서버 렌더러의 진입점 역할
import ReactDOM from "react-dom";
ReactDOM.render(<App />, document.getElementById("root"));
react-scripts is a set of scripts from the "create-react-app starter pack" cra로 생성하면 기본 설정되어지는 부분
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
웹 어플리케이션에서 React Router 를 사용하기 위한 바인딩이 포함 SPA의 동작을 가능하게 해준다
// v6
import { BrowserRouter, Routes, Route } from "react-router-dom";
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</BrowserRouter>
// v5
//Routes === Switch
<Switch>
<Route path="/">
<App />
</Route>
</Switch>;
State를 따로 관리하여 계층에 상관없이 필요한 컴포넌트에서 사용 가능 변경된 내용이 다른 컴포넌트에도 영향을 줌 component => action(dispatch) => (handle) => reducer(update) subscribe 상태라 component에 반영됨
react-redux는 react의 코드 구조를 지키며 redux를 보다 편하게 사용하기 위함
import { Provider } from "react-redux";
import { connect } from "react-redux";
// mapStateToProps, mapDispatchToProps
효율적인 redux 사용을 위한 공식 툴킷 보다 간단하고 명료한 작성을 가능하게 한다
redux 동작을 편하게 모니터 할 수 있는 여러 툴을 제공
단방향 흐름을 통해 리덕스에서 router상태를 동기화 (history객체 -> store-> router-> component) 라우팅과 관련된 정보들을 Redux의 store에 저장 해야 할 경우 사용 Dispatching of history methods (push, replace, go, goBack, goForward) works for both redux-thunk and redux-saga.
import { ConnectedRouter } from "connected-react-router";
<Provider store={store}>
<ConnectedRouter history={history}>
<Switch>
<Route path="/">
<App />
</Route>
</Switch>
</ConnectedRouter>
</Provider>;
JavaScript가 실행되는 모든 곳에서 세션 히스토리를 쉽게 관리할 수 있다
action => (middleware) => dispatch => reducer dispatch 전에 추가 작업을 처리 (logger, 권한, 로그인 검증)
dispatch 수행 시 항상 로그를 남긴다
redux 사용 시 비동기 작업을 처리할 때 사용됨 참고 - saga도 많이 사용됨 action 객체가 아닌 함수를 dispatch 할 수 있음
// id 와
export const getPost = (postId) => (dispatch) => {
// dispatch, getState로 하면 현재 상태 조회도 가능
// 요청을 시작
// reducer에 바로 들어감
dispatch({ type: GET_REQUEST });
return getApi(postId)
.then((res) => {
dispatch({
type: GET_SUCCESS,
payload: res,
});
})
.catch((error) => {
dispatch({
type: GET_FAILURE,
payload: error,
});
throw error;
});
};