January 27, 2024 • ☕️ 7 min read
for-in
루프에는 반드시 if
문을 작성해야 하는 룰
for (key in foo) {
doSomething(key);
}
for문 내부 코드에서 unexpected error가 날 수 있기 때문이다
ex) key 값의 타입이 doSomething
함수의 인자로 들어가면 안 되는 타입인 경우
Ref https://eslint.org/docs/latest/rules/guard-for-in
react-router v6부터 래핑한 <Route>
컴포넌트(ex. <PageRoute>
)는 <Routes>
의 자식 컴포넌트로 사용하지 못한다
다음처럼 사용하거나,
<Route path="/wrapped" element={<Wrapped>wrapped component</Wrapped>} />`
공식 문서에서 권장하는 방식의 Layout Routes
를 사용해야 한다.
<Routes>
<Route element={<PageLayout />}> {/** ⬅️ */}
<Route path="/privacy" element={<Privacy />} />
<Route path="/tos" element={<Tos />} />
</Route>
<Route path="contact-us" element={<Contact />} />
</Routes>
Ref https://reactrouter.com/en/main/start/concepts#layout-routes
react router v6에는 그냥(?) Router(ex.<BrowserRouter>
로 래핑하는 방식)와 Data Router가 있다
data router에는 다음과 같은 API가 있으며,
위 목록 중 하나를 사용했을 때만 data API들을 사용할 수 있다.
data router 객체 생성 후 최상단의 index.tsx
에서 <RouterProvider>
에 주입하여 사용한다.
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
loader: rootLoader,
children: [
{
path: "team",
element: <Team />,
loader: teamLoader,
},
],
},
]);
ReactDOM.createRoot(document.getElementById("root")).render(
<RouterProvider router={router} />
);
Warning: You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one
에러한 번에 여러 개의 동작을 수행할 수 없음을 나타낸다.
그렇다면 act()
는 언제 써야 할까?
이미 act로 감싸져 호출되는 경우가 대부분이라 내가 직접 쓸 일이 없다.
act()
는 함수를 인자로 받는데, 이 함수를 실행시켜서 가상의 DOM(jsdom)에 적용하는 역할을 한다. act()
함수가 호출된 뒤, DOM에 반영되었다고 가정하고 그 다음 코드를 쓸 수 있게 되서 React가 브라우저에서 실행될 때와 최대한 비슷한 환경에서 테스트할 수 있다.
💁♀️ render
와 fireEvent
등은 이미 act로 감싸져 있다!
위 에러의 해결 방법:
userEvent
를 여러번 호출할 때는 앞에await
을 붙여줘서 다음 액션이 이전 액션이 끝나기를 기다리도록 한다!
Ref https://flyingsquirrel.medium.com/when-should-i-use-act-in-react-testing-library-d7dd22a3340e
DeepRequired<T>
type DeepRequired<T> = {
[K in keyof T]-?: T[K] extends object ? DeepRequired<T[K]> : T[K]
}
NestedKeyOf<T>
type NestedKeyOf<DataType> = {
[Key in keyof DataType & (string | number)]: DataType[Key] extends object
? `${Key}` | `${Key}.${NestedKeyOf<DataType[Key]>}`
: `${Key}`
}[keyof DataType & (string | number)]
다음 button 요소를 클릭하면 콘솔 출력 결과는 어떻게 될까? 🥸
<button
type='button'
onFocus={() => console.log('focused')}
onBlur={() => console.log('blurred')}
>
버튼
</button>
결과
대부분의 브라우저는 버튼 클릭 시 버튼에 focus가 가지만, Safari는 지원하지 않는다 🤷♀️
Ref https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#clicking_and_focus
pnpm -C
- Run as if pnpm was started in <path>
instead of the current working directory. 현재 working directory가 아닌 다른 폴더에 위치한 것처럼 속여서 해당 패키지의 명령어를 실행할 수 있게 해준다.커서를 손쉽게 이동할 수 있고, 자동완성을 넘어 AI 추천 커맨드까지 제공하는 터미널 WARP
동시성(concurrent)와 병렬성(parallel)을 드디어 이해하게 되었다.
Ref
‘품질이 좋은 컨텐츠’, ‘자기 생각과 경험이 담긴 컨텐츠’가 중요하다.
Ref https://junghyeonsu.com/posts/search-quality-evaluator-guidelines/
슬슬 재밌는 생각들, 일들이 생겨나고 있는 요즘이다.
물론 내 뜻대로 안 될 때도 많지만
걱정없이 설레보는 하루하루