ziglog

    Search by

    1월 1-2주차 기록

    January 10, 2025 • ☕️ 5 min read

    배워가기


    컴포넌트 안에서 Promise 던지기

    React Suspense로 감싼 컴포넌트에서 Promise를 던지면?

    Copy
    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>
      );
    }

    Suspensefallback으로 떨어진다!

    Ref https://dev.to/heyitsarpit/suspense-in-react-18-4ca0

    react loadable-components

    React.lazy와 비교했을 때 SSR, library splitting을 지원하는 것이 특징!

    Ref

    react-hook-form isDirty

    • 사용자가 input 값 중 하나라도 변경하면 true 값이 된다.
    • useForm에서 모든 input의 defaultValue를 제공해야 hook form이 SoC 원칙에 따라 어떤 form이 dirty한지 체크할 수 있다.

    Ref https://react-hook-form.com/docs/useformstate

    react-query mutation의 mutationKey의 역할

    useQueryqueryKey는 서버 데이터를 캐싱할 때 쓰인다지만, mutationKey는 쓸 필요가 있나? 🤔

    mutationKey의 역할은 다음과 같다.

    • mutation 전역 설정 - queryClient에 setMutationDefaults를 이용해 key에 대한 기본 mutation을 설정할 수 있다.

    • useMutationState hook - 필터 조건에 해당하는 MutationCache 정보를 수집할 수 있다.

    • useIsMutation - 해당하는 mutation이 현재 얼마나 fetching되고 있는지 확인할 수 있다.

    Ref

    react-query invalidateQueriesrefetchType

    invalidateQueries 메소드에 refetchType: 'none' 옵션을 추가하면, 무효화된 쿼리가 자동으로 다시 실행되지 않는다.

    이 설정을 통해 해당 쿼리는 무효화되지만, 즉시 다시 데이터를 가져오지는 않는다. 대신, 다음번에 해당 쿼리가 필요할 때 다시 실행된다.

    refetchType에 들어올 수 있는 값은 다음과 같다.

    • active - refetch 조건과 일치하며 현재 useQuery 등을 통해 **활성 상태(렌더링 중)**인 쿼리만 백그라운드에서 다시 가져옵니다.

    • inactive - refetch 조건과 일치하며 현재 useQuery 등을 통해 **비활성 상태(렌더링 중이지 않음)**인 쿼리만 백그라운드에서 다시 가져옵니다.

    • all - refetch 조건과 일치하는 모든 쿼리가 백그라운드에서 다시 가져옵니다.

    • none - 쿼리를 다시 가져오지 않으며, refetch 조건과 일치하는 쿼리는 무효화만 됩니다.

    React ref의 비밀(?)

    리액트 트리 깊숙한 곳(?)에 위치한 컴포넌트에서 선언한 ref를 DOM에 직접 붙이는 경우에는 컴포넌트 마운트 (useEffect 에 빈배열 넣어서 테스트) 시에 ref object에 값이 있지만,

    리액트 트리 상 하위 컴포넌트가 아닌, Route에서 처음으로 렌더하는 페이지 컴포넌트에서 선언한 ref는 페이지 컴포넌트 마운트 시 undefined가 된다!

    그래서 컴포넌트 마운트 시 ref에 대한 조작을 하려면 useCallback을 사용해야 한다…

    Copy
    const myRef = useCallback<RefCallback<HTMLElement | null>>((node) => {
      if (node) {
        node.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
      }
    }, []);

    이것저것 모음집


    기타공유


    CodingFont

    코딩폰트 월드컵

    (너무 많아서 다 안 해봄) ㅋ

    Ref https://www.codingfont.com/

    <img>alt는 항상 필요하진 않다.

    alt 텍스트는 웹 접근성을 위해 필요하며, 사용자가 달성하고자 하는 의도를 돕기 위해 필요하다.

    이때 단순히 눈에 보이는 개별 정보에 의존하는 것이 아니라, 전체 페이지의 맥락에서 이미지를 설명할 수 있어야 한다.

    스크린리더의 사용자는 이미지가 어떻게 생겼는지가 궁금한 것이 아니라, 이미지가 렌더링된 의도를 알고 싶어한다.

    다른 곳에서 충분히 설명되어 있는 정보라면 이미지에 alt 텍스트는 불필요할 수도 있다.

    • 이미지에서 설명하는 정보가 중복되었는지
    • 설명하는 정보가 정확히 해당 이미지를 가리키는지
    • 사용자가 원하는 정보를 효과적으로 얻을 수 있는지

    를 고려하여 alt 텍스트를 사용하도록 하자!

    Ref https://www.nngroup.com/articles/alt-text-usability/

    Gostty

    개발자에게 이쁘고 타건감 좋은 키보드만큼이나 중요한 건 역시

    이쁘고 타건감 좋은 터미널

    Ref https://github.com/ghostty-org/ghostty

    Operating System in 1,000 Lines

    컴공 수업 맛만 본 나

    1000줄로 OS를 만들어볼까?

    Ref https://operating-system-in-1000-lines.vercel.app/en/

    다크패턴방지법

    전자상거래법에 명시된 조항으로, 2025년 2월 14일 시행 예정

    법안에서 금지된 ‘다크패턴’ 유형 예시

    • 총비용이 아닌 일부 금액만 고지
    • 선택항목의 크기·모양·색깔 등을 부각해 특정 항목 선택을 유인
    • 취소·탈퇴·해지의 방해
    • 팝업창을 통해 선택 내용 변경을 반복해서 요구 등

    수많은 사이트들이 떠오르는군 🙃

    Bye, Recoil

    Recoil의 github repo가 archive 되었다. 😇

    이렇게 역사 속으로…

    Ref https://github.com/facebookexperimental/Recoil

    마무리


    연초부터 별로 좋지 않은 소식들만 들려오는 올해 🫠

    독감은 아직 찾아오지 않았지만 갑자기 생긴 축농증과 위염으로 골골대며 보낸 한 주

    살살해주라주


    Relative Posts:

    12월 3-4주차 기록

    December 24, 2024

    zigsong

    지그의 개발 블로그

    RotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-icon