안녕하세요, 패스트 캠퍼스 메가바이트 스쿨 프론트 엔드 3기 수료 중인 김당퀔입니다! 이번 3기 수료 기간은 9월 13일부터 4월 14일까지 총 7개월 과정입니다. 7개월 동안 매주 주말 회고록을 작성해 보려고 합니다.
블로그 제출 기한으로 인해서 지난 금요일부터 해당 주 목요일까지의 사이클로 작성됩니다.
농놀... 했어요 🏀
<Route />
컴포넌트에 의해 렌더링 된 컴포넌트에 기존 Route의 중첩된 <Route />
의 컴포넌트가 나타나도록 구성하는 <Route />
컴포넌트의 적용 방법. <Route path="/parents" element={<Parent />}>
<Route index element={<DefaultChild />} />
<Route path=":param" element={<Child1 />} />
</Route>
issue_template
, pull_request_template
작성리액트 라우터 훅 | 설명 |
---|---|
useMatch() | 현재 요청 경로가 지정한 경로 패턴에 매칭되는 경우 PathMatch 객체를 리턴. PathMatch는 매칭된 경로 정보를 담고 있다. |
useParams() | URI 파라미터 값을 포함하는 Params 객체를 리턴. |
useSearchParams() | 현재 요청의 쿼리 문자열을 읽거나 수정할 수 있다. 쿼리 문자열은 URL 뒤에 ?a=1&b=2와 같이 따라붙는 문자열 정보. |
useLocation() | 현재 요청된 경로 정보를 포함하는 Location 객체를 리턴. |
useNavigate() | 화면 전환(이동)을 위한 Navigate 함수를 리턴. |
useOutletContext() | 상위 경로에 상태를 저장하고 Outlet 컴포넌트에 렌더링 하는 자식 컴포넌트에서 상태에 접근할 수 있도록 한다. |
const pathMatch = useMatch(경로패턴)
params: URI 경로 파라미터
pathname: 요청된 경로
pattern: 요청된 경로 패턴
const [searchParams, setSearchParams] = useSearchParams()
searchParams: 쿼리 문자열을 읽을 수 있는 전용의 객체, ?a=1&b=2
와 같이 요청한 경우 searchParams.get('a')와 같이 값에 접근할 수 있다.
setSearchParams: 쿼리 문자열을 설정할 수 있는 기능을 제공하는 함수.
const navigate = useNavigate()
navigate(to, options)
to: 이동하려는 경로
options: 경로를 이동할 때 지정할 수 있는 옵션
const location = useLocation()
pathname: 현재 요청된 경로
search: 쿼리 문자열
state: navigate()로 이동할 때 전달된 상태(state) 정보
상위 라우트가 렌더링 하는 컴포넌트 (컴포넌트를 렌더링 하는 컴포넌트)에서 상태 또는 속성을 컴포넌트의 context에 지정하여 전달.
중첩 라우트의 자식 컴포넌트에서 useOutletContext() 훅을 이용해 context 객체를 받아서 이용.
BrowserRouter
HTML5 History API를 사용하여 URI와 UI를 동기화한 상태를 유지할 수 있는 기능을 제공. 웹 브라우저에서 리액트 라우터를 적용할 때 가장 권장.
HashRouter
URL의 해시 정보를 이용해서 URI 경로와 UI를 동기화한 상태로 유지. BrowserRouter가 지원되지 않는 환경일 때 사용할 것을 권장.
MemoryRouter
애플리케이션의 메모리 영역에 배열을 만들어 라우팅 정보를 저장하고 UI와 동기화. URI 경로가 브라우저의 주소창에 표시되지 않고 메모리에만 유지. 브라우저 주소 UI를 보여 주지 않아도 되는 하이브리드 앱 같은 경우에 사용.
웹 서버에서 404 Not Found 에러가 발생하더라도 정해진 기본 페이지를 응답하는 기능. fallback UI를 지원하도록 웹 서버를 설정할 수 없다면 HashRouter를 사용하면 된다.
현재 요청된 경로와 일치 여부에 따라 각기 다른 스타일을 부여할 수 있는 Link 컴포넌트.
<NavLink to ='/blog' style={({ isActive }) => {
return isActive ? activeStyle : undefined
}}
>
Blog
</NavLink>
// 기존의 정적 import 방법
import Home from "./Home";
// React.lazy()와 import 함수 사용
const Home = React.lazy(() => import("./Home"));
// webpackChunkName 지정
const Home = React.lazy(() => import(/* webpackChunkName:'home' */ "./Home"));
const Blog = React.lazy(() => import(/* webpackChunkName:'home' */ "./Blog"));
webpackChunkName 주석은 이름이 같은 것끼리 모아서 청크 파일을 생성, 생성된 청크 파일의 이름은 home.f4c1eac5.js와 같이 생성됨. webpackChunkName은 함께 사용되는 컴포넌트를 모아서 하나의 청크로 생성해 줌.
코드 스플리팅(code splitting): 코드를 여러 개의 조각으로 분할.
CRA 도구를 이용해 리액트 프로젝트를 생성했다면 webpack이 기본으로 지원되므로 별도의 설정을 하지 않아도 되지만 vite로 생성된 프로젝트는 별도의 설정이 필요.
$ npm install -D vite-plugin-webpackchunkname
// vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin=react";
import { manualChnksPlugin } from "vite-plugin-webpackchunkname";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), manualChunksPlugin()],
});
// 1. 특정 컴포넌트를 감싸 줄 수 있다.
<React.Suspense fallback={<Loading />}>
<TestComponent />
</React.Suspense>
// 2. <Router /> 컴포넌트도 감싸 줄 수 있다.
<React.Suspense fallback={<Loading />}>
<Router>...</Router>
</React.Suspense>
사이드 프로젝트도 애매하게 멈추어 있고, 미니 프로젝트도 이제 막 시작해서 정신이 없는 한 주. 회의가 끝나나 싶으면 또 다른 회의가 생기는 매직. 앞으로 계속 팀원들이랑 작업을 할 것 같은데 내 역량을 더 많이 키워야 할 것 같다. 얼른 노마드코더 강의도 보고... redux에 익숙해져야만!!! 그래도 이번 주에 농놀(슬램덩크 봤다는 뜻)도 하고 부석순 컴백으로 아주 파이팅!!! 해야지!! 상태. 아좌작. 그리고 요즘 들어서 더 드는 생각은 글을 재미있게 쓰고 싶다는 생각이다. 내가 쓴 글은 별로 재미있다고 생각하지 않아서 그런 것도 있지만 개발 블로그들을 보다 보면 정말 재미있고, 쉽고, 더 궁금하게 만드는 글들이 많다. 회고록 같은 것들도. 재미있게 쓰는 법을 익히고 싶다. 책도 많이 읽자!