• ✏️ Recoil 사용하기

    2024. 3. 2.

    by. 서카츄

     

    Docs

     

    Recoil 시작하기 | Recoil

    React 애플리케이션 생성하기

    recoiljs.org

     

     

     


     

    Recoil의 상태관리

    Recoil은 원자 기반의 상태 관리 방식을 사용한다.

    상태는 원자의 단위로 관리되고, 컴포넌트는 이 원자의 구독자가 된다.

     

     

    상태 업데이트 방식

    Recoil은 상태 변경 시 전체 컴포넌트 트리를 재렌더링하지 않고, 변경된 원자의 구독자만 재렌더링한다.

    React Hooks와 유사하게 작성되어 있다. 예를 들어 useRecoilState, useRecoilValue 등의 Hooks이 있다.

     

     


     

    🤔 이쯤에서 궁금한 Recoil과 Zustand의 차이점

      Recoil Zustand
    상태관리  원자 기반의 상태 관리 방식을
    상태는 원자라는 단위로 관리,
    컴포넌트는 이 원자의 구독자가 됨.
    스토어 기반의 상태 관리 방식
    상태는 하나의 전역 스토어에 관리,
    컴포넌트는 이 스토어에서 상태를 가져옴.
    상태 업데이트 방식 전체 컴포넌트 트리를 재렌더링하지 않고,
    변경된 원자의 구독자만 재렌더링
    스토어 전체를 구독하고 있는
    컴포넌트만 재렌더링
    API React Hooks와 유사한 스타일,
    useRecoilState, useRecoilValue 등
    간단한 API를 제공,
    상태와 액션을 포함하는 하나의 객체를 작성하고, useStore Hook을 사용하여 접근
    성능 Recoil은 변경된 원자의 구독자만 재렌더링하므로 대규모 애플리케이션에서 성능이 더 좋을 수 있다. Zustand는 상대적으로 더 간단하고 사용이 편리하여 소규모 프로젝트에 더 적합할 수 있다.

     

    따라서 프로젝트의 규모와 복잡도, 팀의 선호도에 따라 Recoil 또는 Zustand 중 하나를 선택하면 된다.

    하지만 둘다 써본 입장에서는 둘다 기본적으로 사용하기 쉬웠지만

    Recoil을 좀더 써보고 왜 요새 트랜드는 Zustand를 쓰는지 판단 해 봐야 할 것 같다..

    결국은 전역상태 관리는 개인 선호도에 따라 갈라질 것 같다!

     

     


     

    Recoil 설치

    npm install recoil
    //또는
    yarn add recoil

     

     

     

    RecoilRoot

    recoil 상태를 관리하는 컴포넌트에 RecoilRoot를 넣어준다.

    Next.js 을 사용하면 따로 provider 컴포넌트로 만들어서 넣어줘도 된다.

     

    import React from 'react';
    import {
      RecoilRoot,
      atom,
      selector,
      useRecoilState,
      useRecoilValue,
    } from 'recoil';
    
    function App() {
      return (
        <RecoilRoot>
          <CharacterCounter />
        </RecoilRoot>
      );
    }

     

     

    또는

    RecoilProvider.tsx

    "use client";
    import { RecoilRoot } from "recoil";
    import { AuthProvider } from "./AuthProvider";
    
    const RecoilProvider = ({ children }: { children: React.ReactNode }) => {
      return (
        <RecoilRoot>
          <AuthProvider>{children}</AuthProvider>
        </RecoilRoot>
      );
    };
    
    export default RecoilProvider;

     

     


     

    사용법

    초기값을 관리하는 파일 만들기

    index.ts

    import { atom } from "recoil";
    
    export const isEditState = atom({
      key: "isEditState", //변수명
      default: false, //초기값
    });

     

    key는 변수명(컴포넌트에서 사용할 이름)

    default는 초기값을 의미한다.

     

     

     

     

     

    사용하려는 컴포넌트

    import { useState } from "react";
    
    const Edit = () => {
      const [isEdit, setIsEdit] = useState(false);
      return <div>Recoil 연습하기</div>;
    };
    
    export default Edit;

     

    기존 컴포넌트에서는 이렇게 사용할 것인데

    useState와 유사하니 내가 알기 쉽게 정리하자면,

    useState 대신 useRecoilState

    false자리엔 대신 isEditState로 바꿔준다.

     

     

     

     

     

    적용한 결과

    import { isEditState } from "@/store";
    import { useRecoilState } from "recoil";
    
    const Edit = () => {
      const [isEdit, setIsEdit] = useRecoilState(isEditState);
      return <div>Recoil 연습하기</div>;
    };
    
    export default Edit;

     

    store에 있는 isEditState 내용을 가져와서 사용한다! 라고 보면된다.

    useRecoilState에서 가져오고, isEditState에 있는 내용을 꺼내와서

    isEdit 이름으로 바꿔서 사용한다고 생각하면 된다!

     

     

     

     

     

     

     

     

     

     

    댓글