[React] Recoil - 사용하기

2022. 11. 10. 12:52·React/실험실
반응형

들어가며

앞서 시작하기를 통해서 Recoil에 대해서 알아봤다.

이번에는 실제 React에서 어떤 방식으로 Recoil을 사용하는지 알아보려고 한다. 

 

환경 세팅 

npx create-react-app recoil

먼저 React 프로젝트가 필요하기 때문에 간단하게 CRA를 사용해서 환경을 만들었다. 

 

yarn add recoil

당연히 recoil 패키지가 필요하기 때문에 최신 버전을 설치했다. 

 

RecoilRoot

// App.jsx
import { RecoilRoot } from "recoil";

function App() {
  return (
    <RecoilRoot>
      <div>Recoil Study</div>
    </RecoilRoot>
  );
}

export default App;

Redux에서 Provider를 사용해서 Redux를 사용할 컴포넌트를 나타냈는데, 

Recoil도 마찬가지로 RecoilRoot을 사용해서 Recoil의 상태를 전역으로 설정한다.

 

Atom

Atom은 상태를 나타낸다고 했다. 

Atom은 어떤 컴포넌트에서나 읽고 쓸 수 있으며, Atom 값을 읽는 컴포넌트는 암묵적으로 

해당 Atom을 구독하게 된다. 

 

그래서 변화가 감지되면 구독하고 있는 모든 컴포넌트에서 리렌더링이 발생하게 된다. 

import { atom, useRecoilState } from "recoil";

const numberState = atom({
  key: "numberState",
  default: 0,
});

const Counter = () => {
  return (
    <div>
      <TextInput />
      <Echo />
    </div>
  );
};

const TextInput = () => {
  const [_, setNumber] = useRecoilState(numberState);

  const handleInputChange = (e) => {
    setNumber(e.target.value);
  };

  return (
    <div>
      <input type="number" onChange={handleInputChange} />
    </div>
  );
};

const Echo = () => {
  const [number, _] = useRecoilState(numberState);

  return <div>{number}</div>;
};

export default Counter;

Counter를 하는 컴포넌트를 한 개 만들었다. 

 

const numberState = atom({
  key: "numberState",
  default: 0,
});

atom을 사용해서 상태를 만들었는데, key는 고유한 ID값으로 다른 Atom과 같은 Key를 사용하면 안된다.

 

그리고 default에는 초기값을 설정해주면 된다.

const TextInput = () => {
  const [_, setNumber] = useRecoilState(numberState);

  const handleInputChange = (e) => {
    setNumber(e.target.value);
  };

  return (
    <div>
      <input type="number" onChange={handleInputChange} />
    </div>
  );
};

 사용하는 방식은 useState와 비슷하게 useRecoilState는 state값과 setState를 return해준다. 

여기서 setState를 담당하는 setNumber는 사용해서 input이 변하게 되면 그 값을 state에 넣었다. 

 

const Echo = () => {
  const [number, _] = useRecoilState(numberState);

  return <div>{number}</div>;
};

state를 실제 사용하는 컴포넌트이다. 

TextInput에서 onChange를 통해서 값을 변경하면 Echo에 있는 number 도 구독을 하기때문에 

리렌더링이 발생하고 값이 최신화가 된다. 

 

Selector

Selector는 상태의 변화를 나타낸다. 

import { atom, selector, useRecoilState, useRecoilValue } from "recoil";

const numberState = atom({
  key: "numberState",
  default: 0,
});

const numberPlusState = selector({
  key: "numberPlusState",
  get: ({ get }) => {
    const number = get(numberState);

    return number + 10;
  },
});

// ...

const Echo = () => {
  const [number, _] = useRecoilState(numberState);
  const plusNumber = useRecoilValue(numberPlusState);

  return (
    <div>
      <p>{number}</p>
      <p>{plusNumber}</p>
    </div>
  );
};

export default Counter;

 

const numberPlusState = selector({
  key: "numberPlusState",
  get: ({ get }) => {
    const number = get(numberState);

    return number + 10;
  },
});

numberPluseState는 get을 통해서 다른 numberState의 값을 가져와서 10을 더하고 return해주고 있다.

 

const Echo = () => {
  const [number, _] = useRecoilState(numberState);
  const plusNumber = useRecoilValue(numberPlusState);

  return (
    <div>
      <p>{number}</p>
      <p>{plusNumber}</p>
    </div>
  );
};

useRecoilValue를 사용해서 numberPlusState 값을 얻어올 수 있다.

 

정리 

간단하게 Recoil을 사용해봤는데, 정리하자면 atom은 상태를 나타내고, 

selector는 atom 혹은 다른 selector의 상태를 가져와서 주어진 상태를 수정하는

순수 함수라고 보면 될 것 같다.

 

확실하게 Redux에 비해서 사용하는 방법이 훨씬 간단한 것 같다. 

Redux였다면 Store를 만드는 것부터 시작해서 신경써야하는 부분이 많았을 텐데, Recoil을 

사용해서 간단하게 구현이 가능하다!

반응형
저작자표시 비영리 변경금지

'React > 실험실' 카테고리의 다른 글

[React] Test Coverage  (0) 2022.11.15
[React] Recoil - Todo 만들기  (0) 2022.11.11
[React] Recoil - 시작하기  (0) 2022.11.09
[React] Context API 사용하기  (0) 2022.11.05
[React] Redux vs Context API  (0) 2022.11.04
'React/실험실' 카테고리의 다른 글
  • [React] Test Coverage
  • [React] Recoil - Todo 만들기
  • [React] Recoil - 시작하기
  • [React] Context API 사용하기
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    CSS
    식물
    ReactNative
    네이버 부스트캠프
    영어회화
    redux
    webpack
    ChatGPT
    react
    next.js
    CCNA
    영어독학
    프로그래머스
    리얼학습일기
    리액트
    Node.js
    타일러영어
    javascript
    Docker
    덤프
    자바스크립트
    Babel
    네트워크
    바질
    알고리즘
    바질 키우기
    리얼클래스
    typescript
    타입스크립트
    다이소
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] Recoil - 사용하기
상단으로

티스토리툴바