MPA
- Multi Page Application
- 여러 페이지를 만들고, 각 요청에 따라 적절한 페이지를 보여주는 방식
라우팅 이란?
- 사용자가 요청한 URL에 따라 해당 URL에 맞는 페이지를 보여주는 것 → 경로를 지정하는 행위!
- 가장 많이 쓰이는 라이브러리 : React Router
개발자가 주소별로 다른 컴포넌트를 보여주기 위해 사용하는 라이브러리
npm i react-router-dom@6 # 버전6 지정 설치
컴포넌트란?
- 재사용 가능한 웹의 구성요소
- 웹 응용 프로그램에서 재사용 가능한 구성 요소를 만들 수 있게 해주는 일련의 표준 기반 웹 플랫폼 API 세트
import { BrowserRouter } from 'react-router-dom';
const ReactRouter = () => {
return (
<div>
<BrowserRouter>
</BrowserRouter>
</div>
);
};
<Routes>
<Route path="/" element={<RouteMain />}></Route>
<Route path="/product/:id" element={<RouteProduct />}></Route>
<Route path="*" element={<RouteNotFound />}></Route>
</Routes>
// element: 연결할 컴포넌트
<Link to="/">
<h1>헤더입니다.</h1>
</Link>
import { useParams } from 'react-router-dom';
const { 파라미터명 } = useParams();
// const 변수명 = useParams().파라미터명;
const [searchParams, setSearchParams ] = useSearchParams();
...
searchParams.get('mode');
...
setSearchParams({ mode: 'Dark' });
const navigate = useNavigate();
...
<li><button onClick={() => naviate(-2)}>Go 2 pages back</button></li>
<li><button onClick={() => naviate('/')}>Go Root</button></li>
npm install react-hook-form
import React from 'react';
import { userForm } from 'react-hook-form';
function ExampleForm() {
const { register, handleSubmit, formState: { errors }, } = useForm();
const onSubmit = (data) => {
console.log(data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input name="example" ref={register({ required: true })} />
{errors.example && <span>This field is required</span>}
<button type="submit">Submit</button>
</form>
);
}
→ Cross-Component와 App-Wide State일 때 Context API나 Redux가 요구됨
JavaScript 상태 관리 라이브러리
{
type: 'CHANGE_INPUT',
text: '안녕하세요'
}
{
type: 'INCREASE'
}
const initialState = {
counter: 1
};
function reducer(state=initialState, action) {
switch(action.type) {
case 'INCREMENT':
return {
counter: state.counter + 1
};
default:
return state;
}
}
npm install redux react-redux @reduxjs/toolkit
@redux/toolkit
- Redux의 복잡성을 줄이기 위해 만들어진 도구
- action 생성, reducer, 미들웨어 등 redux와 관련된 기능들을 효율적으로 구현
import { Provider } from "react-redux"
import store from "./store";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
import { useSelector, useDispatch } from "react-redux";
...
const number = useSelector(state => state.number);
...
const dispatch = useDispatch();
<button onClick={() => {dispatch({type:'INCREASE'})}}>+1</button>
<button onClick={() => {dispatch({type:'DECREASE'})}}>-1</button>
const counterSlice = createSlice({
name: "counter",
initialState: initialCounterState,
reducers: {
increment(state) {
state.counter++;
},
decrement(state) {
state.counter--;
},
increase(state, action) {
state.counter = state.counter + action.payload;
},
},
});
const store = configureStore({
reducer: { counter: counterSlice.reducer, auth: authSlice.reducer },
});
export const counterActions = counterSlice.actions;
export const authActions = authSlice.actions;
export default store;
Chrome 확장 프로그램 Redux DevTools
npm install redux-devtools-extension
import { composeWithDevTools } from "redux-devtools-extension"; ... const store = configurationStore({reducer: reducer}, composeWithDevTools());
- Store된 State 확인 가능