React의 상태 관리를 할 수 있는 라이브러리 중 하나로, 과제로 인해 처음 사용하게 됐는데 공식 문서에 설명이 그렇게 복잡하지는 않아서 관련 자습서 내용을 따라 진행해봤다.
1. RecoilRoot : Recoil을 사용하기 위해서는 루트 컴포넌트에 다음과 같이 이 RecodilRoot라는 컴포넌트를 감싸주어 전역에서 상태를 관리할 수 있도록 해주어야한다.
import React from "react";
import ReactDOM from "react-dom/client";
import { RecoilRoot } from "recoil";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<RecoilRoot>
<App />
</RecoilRoot>
</React.StrictMode>
);
2. atom: Recoil에서는 상태 단위 값으로 atoms을 사용한다. 마치 Hooks에서 사용하는 useState와 비슷하지만 전역에서 사용할 수 있다는 부분이 다르다.
< src/state/text.js >
import { atom } from "recoil";
export default atom({
key: "TextState",
default: "",
});
< src/state/index.js >
import TextState from "./text";
import CharCountState from "./charCount";
export { TextState, CharCountState };
state라는 폴더를 두고 atom을 만들어서 export default 한 후 그 atom을 index.js에 모아서 한 번에 보기 좋게 관리하는 형식을 많이 이용한다. (state 디렉토리 안의 index.js 라는 것에 유의한다.)< src/components/TodoList.jsx >
import React from "react";
import { useRecoilState } from "recoil";
import { TextState } from "../state";
function TodoList() {
const [text, setText] = useRecoilState(TextState);
const onChange = (e) => {
setText(e.currentTarget.value);
};
return (
<div>
<input type="text" value={text} onChange={onChange} />
<br />
Echo : {text}
</div>
);
}
export default TodoList;
3. selector : 비동기 처리 혹은 복잡한 로직을 처리하기 위해서 사용하는 특정 atom의 파생된 상태로 크게 두 가지 기능을 가지고 있다.
< src/state/charCount >
import { selector } from "recoil";
import textState from "../state/text";
export default selector({
key: "charCountState",
get: ({ get }) => {
const text = get(textState);
return text.length;
},
});
selector({ key, get, [ set ] })
get 속성만 사용하는 경우 읽기 전용이고, set까지 사용하는 경우 양방향으로 쓰기가 가능해진다.
< src/components/CharCount.jsx >
import React from "react";
import { useRecoilValue } from "recoil";
import { CharCountState } from "./state";
function CharCount() {
const counter = useRecoilValue(CharCountState);
return <div>Character Count : {counter}</div>;
}
export default CharCount;
.env 파일은 gitIngore로 인해 리모트 저장소에 등록되지 않는다. API Key를 이곳에 두고 호출해서 변수명으로 가져와 사용함으로써 키가 유출되는 것을 막을 수 있다. 이를 이용해서 복사본을 만들어두면 추후 사용자가 API Key를 소유자에게 요청할 수 있게끔 할 수 있다. ( 작업 용이성 증가 ?)