January 10, 2025 • ☕️ 5 min read
React Suspense로 감싼 컴포넌트에서 Promise
를 던지면?
import React, { Suspense } from "react";
function fetchData() {
let data;
let promise = new Promise((resolve) => {
setTimeout(() => {
data = "Hello, Suspense!";
resolve(data);
}, 2000);
});
// Suspense에서 사용하려면 Promise를 throw
if (!data) {
throw promise;
}
return data;
}
function AsyncComponent() {
const data = fetchData();
return <div>{data}</div>;
}
export default function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<AsyncComponent />
</Suspense>
);
}
Suspense
의 fallback
으로 떨어진다!
Ref https://dev.to/heyitsarpit/suspense-in-react-18-4ca0
React.lazy
와 비교했을 때 SSR, library splitting을 지원하는 것이 특징!
Ref
isDirty
true
값이 된다.useForm
에서 모든 input의 defaultValue
를 제공해야 hook form이 SoC 원칙에 따라 어떤 form이 dirty한지 체크할 수 있다.Ref https://react-hook-form.com/docs/useformstate
useQuery
의 queryKey
는 서버 데이터를 캐싱할 때 쓰인다지만, mutationKey
는 쓸 필요가 있나? 🤔
mutationKey
의 역할은 다음과 같다.
mutation 전역 설정 - queryClient에 setMutationDefaults
를 이용해 key에 대한 기본 mutation을 설정할 수 있다.
useMutationState
hook - 필터 조건에 해당하는 MutationCache
정보를 수집할 수 있다.
useIsMutation
- 해당하는 mutation이 현재 얼마나 fetching되고 있는지 확인할 수 있다.
Ref
invalidateQueries
의 refetchType
invalidateQueries
메소드에 refetchType: 'none'
옵션을 추가하면, 무효화된 쿼리가 자동으로 다시 실행되지 않는다.
이 설정을 통해 해당 쿼리는 무효화되지만, 즉시 다시 데이터를 가져오지는 않는다. 대신, 다음번에 해당 쿼리가 필요할 때 다시 실행된다.
refetchType
에 들어올 수 있는 값은 다음과 같다.
active
- refetch 조건과 일치하며 현재 useQuery 등을 통해 **활성 상태(렌더링 중)**인 쿼리만 백그라운드에서 다시 가져옵니다.
inactive
- refetch 조건과 일치하며 현재 useQuery 등을 통해 **비활성 상태(렌더링 중이지 않음)**인 쿼리만 백그라운드에서 다시 가져옵니다.
all
- refetch 조건과 일치하는 모든 쿼리가 백그라운드에서 다시 가져옵니다.
none
- 쿼리를 다시 가져오지 않으며, refetch 조건과 일치하는 쿼리는 무효화만 됩니다.
리액트 트리 깊숙한 곳(?)에 위치한 컴포넌트에서 선언한 ref를 DOM에 직접 붙이는 경우에는 컴포넌트 마운트 (useEffect
에 빈배열 넣어서 테스트) 시에 ref object에 값이 있지만,
리액트 트리 상 하위 컴포넌트가 아닌, Route에서 처음으로 렌더하는 페이지 컴포넌트에서 선언한 ref는 페이지 컴포넌트 마운트 시 undefined가 된다!
그래서 컴포넌트 마운트 시 ref에 대한 조작을 하려면 useCallback
을 사용해야 한다…
const myRef = useCallback<RefCallback<HTMLElement | null>>((node) => {
if (node) {
node.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
}
}, []);
코딩폰트 월드컵
(너무 많아서 다 안 해봄) ㅋ
Ref https://www.codingfont.com/
<img>
의 alt
는 항상 필요하진 않다.alt
텍스트는 웹 접근성을 위해 필요하며, 사용자가 달성하고자 하는 의도를 돕기 위해 필요하다.
이때 단순히 눈에 보이는 개별 정보에 의존하는 것이 아니라, 전체 페이지의 맥락에서 이미지를 설명할 수 있어야 한다.
스크린리더의 사용자는 이미지가 어떻게 생겼는지가 궁금한 것이 아니라, 이미지가 렌더링된 의도를 알고 싶어한다.
다른 곳에서 충분히 설명되어 있는 정보라면 이미지에 alt
텍스트는 불필요할 수도 있다.
를 고려하여 alt
텍스트를 사용하도록 하자!
Ref https://www.nngroup.com/articles/alt-text-usability/
개발자에게 이쁘고 타건감 좋은 키보드만큼이나 중요한 건 역시
이쁘고 타건감 좋은 터미널
Ref https://github.com/ghostty-org/ghostty
컴공 수업 맛만 본 나
1000줄로 OS를 만들어볼까?
Ref https://operating-system-in-1000-lines.vercel.app/en/
전자상거래법에 명시된 조항으로, 2025년 2월 14일 시행 예정
법안에서 금지된 ‘다크패턴’ 유형 예시
수많은 사이트들이 떠오르는군 🙃
Recoil의 github repo가 archive 되었다. 😇
이렇게 역사 속으로…
Ref https://github.com/facebookexperimental/Recoil
연초부터 별로 좋지 않은 소식들만 들려오는 올해 🫠
독감은 아직 찾아오지 않았지만 갑자기 생긴 축농증과 위염으로 골골대며 보낸 한 주
살살해주라주