React.js + Next.js
Recoil
진호우
2022. 7. 14. 09:44
React의 공식 상태관리 라이브러리는 아니지만,
현재 페이스북의 리액트를 개발한 팀에 의해 제작되고 출시.
주요 개념
Atoms
- Atoms는 recoil에서 상태의 단위를 의미하고 업데이트와 구독이 가능하다.
Selectors
- Selector는 atoms나 다른 selectors를 입력으로 받는 순수함수이다.
- 최소한의 상태 집합만 atoms에 저장하고, 파생 데이터는 selector에서 계산하면서 불필요한 상태를 만들지 않는다. ex) 국어, 영어 점수를 atoms에 저장, 총점이나 평균은 selector에서 계산 후 get
recoil 설치
npm install recoil
# index.js
1. recoil 관련 import
2. 사용할 곳을 <RecoilRoot> 로 감싼다.
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { RecoilRoot, atom, selector, useRecoilState, useRecoilValue, } from 'recoil';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<RecoilRoot>
<App />
</RecoilRoot>
</React.StrictMode>
);
# atom.js
사용할 전역 변수 만들기
고유의 값인 key설정, 기본값(default)을 설정한다.
import { atom, selector } from "recoil";
const user = atom({
key: 'user',
default: 'kim',
});
export {user}
# Home.js
1. useRecoilState()로 전역변수 사용
2. useResetRecoil()로 초기화
import { useState } from "react";
import {useRecoilState, useResetRecoilState} from 'recoil'
import { user } from '../atom';
const Home = () => {
const [userName, setUserName] = useRecoilState(user);
const resetUserName = useResetRecoilState(user);
const changeNameBtn = () => {
setUserName('lee')
}
const resetNameBtn = () => {
resetUserName()
}
return (
<>
<h1>{userName}</h1>
<div>
<button onClick={changeNameBtn}>lee로 이름변경</button>
</div>
<div>
<button onClick={resetNameBtn}>이름 reset</button>
</div>
</>
)
}
export default Home;
useRecoilState()
useState() 와 사용법이 비슷하며 state를 변경하면 구독하고있는 컴포넌트들은 모두 갱신되어 re-render된다.
아래와 같이 useRecoilValue() 와 useSetRecoilState()로 나눌 수 있는데, 합한 두개가 useRecoilState()와 같은 역할을 한다.
const [userName, setUserName] = useRecoilState(user);
// 이것은
const userName = useRecoilValue(user);
const setUserName = useSetRecoilState(user);
// 와 같다.
selector()
atom의 데이터로 비동기 로직을 처리한다. 이때 selector는 순수함수이다.
- key : selector를 구분할 수 있는 유일한 id, 즉 key 값을 의미합니다.
- get : 에는 derived state 를 return 하는 곳 입니다.x
- set : writeable 한 state 값을 변경할 수 있는 함수를 return 하는 곳 입니다. 여기서 주의할 점은, 자기 자신 selector를 set하려고 하면, 스스로를 해당 set function에서 set하는 것이므로 무한루프가 돌게 되니 반드시 다른 selector와 atom을 set하는 로직을 구성해야 합니다. 또한 애초에 selector는 read-only한 return 값(RecoilValue)만 가지기 때문에 set으로는 writeable한 atom의 RecoilState만 설정할 수 있습니다.
읽기 전용 selector()
export const callNameState = atom({
key: 'callNameState',
get: ({get}) => {
const userCallName = get(userName);
const sir = '님';
return (`${userCallName} ${sir}`);
},
});
export const userCallButton = () => {
const [userName, setUserName] = useRecoilState(user);
const callNameState = useRecoilValue(callNameState);
return (
<>
<div>환영합니다. {callNameState}.</div>
</>
)
}
양방향 selector()
읽고 쓰기가 모두 가능한 selector이며, useRecoilState() 사용이 가능하다.
(아직 작성중)