-
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 이름으로 바꿔서 사용한다고 생각하면 된다!
'📚 이론정리 > React & Next.js' 카테고리의 다른 글
✏️ custom hook 설정하기 (0) 2024.03.09 ✏️ 글로벌 스테이트와 fetch-policy (0) 2024.03.02 ✏️ Zustand (0) 2024.02.29 ✏️ axios는 무엇일까? Next.js app router의 fetch (0) 2024.02.26 ✏️ json-server 설치와 세팅방법 (2) 2024.02.18 댓글