[Recoil] Recoil, atom과 selector
작성:    
업데이트:
카테고리: Recoil
Recoil
- FaceBook에서 만든 React 전용 상태관리 라이브러리
- 비동기 데이터 흐름을 위한 내장 솔루션 제공
- 초기 세팅이 직관적이고 간단
Recoil의 사용
시작
설치
$ npm install recoil
$ yarn add recoil
RecoilRoot
- 사용하고자 하는 부모 컴포넌트에
<RecoilRoot>
를 넣는다. - 보통 최상휘 root인 루트 컴포넌트에 넣는다.
// index.tsx
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { RecoilRoot } from 'recoil';
ReactDOM.render(
<React.StrictMode>
<RecoilRoot>
<App />
</RecoilRoot>
</React.StrictMode>,
document.getElementById('root')
);
Atom
- 데이터 상태의 단위
- Redux에서는
store
, Vuex에서는state
의 개념 - 업데이트와 구독 가능
- atom이 변경되면, 이를 구독하는 곳은 모두 리렌더링된다.
// src/state/QuizDifficulty.ts
import { atom } from "recoil";
export default atom<string | undefined> ({
key: 'QuizDifficulty',
default: undefined,
})
atom
: 객체를 parameter로 받는 functionkey
: 수많은 atom들에 대한 식별자, 고유한 string이 들어가야 한다.default
: global state에 할당하고 싶은 key에 기본값
Selector
Atom이 있는데 왜 Selector가 또 필요할까?
- Atom에 비해 get과 set, 2가지 기능을 더 할 수 있기 때문
key
: atom의 key와 동일한 key이며 프로젝트 내의 selector들에 대해 고유get
: atom을 구독하며 atom이 바뀌는 경우 함께 저장된 로직을 재구성set
- parameter로 호출한 set함수 내부의 atom을 변경
- set 내부에서의 get은 구독하지 않고, atom이나 selector의 값을 찾는 데에만 사용
- 매개변수 2개 중 전자는 Recoil의 상태(state), 후자는 state를 바꿀 새로운 값
export default selector<TResponseData>({
key: 'initialOrderState',
...
set: ({ get, set }) => {
const amount = get(QuizNumbersState);
const difficulty = get(QuizDifficultyState);
set(QueryDataState, { amount, difficulty });
set(QuizNumbersState, DEFAULT_NUMBERS);
set(QuizDifficultyState, undefined);
},
});
댓글남기기