React/Library

[ React ] recoil

Design-loving front-end engineer 2022. 7. 30. 23:07

πŸ”΄  Introduction

βšͺ  메타가 μΆœμ‹œν•œ λ¦¬μ•‘νŠΈ μƒνƒœκ΄€λ¦¬ 라이브러리

βšͺ  2개 μ΄μƒμ˜ μžμ† μ»΄ν¬λ„ŒνŠΈλ‘œ μƒνƒœλ₯Ό 전달할 λ•Œ μœ μš©ν•˜λ‹€

 

🟠  Official

 

μ„€μΉ˜ | Recoil

NPM

recoiljs.org

 

🟑  Install

 
react i recoil

 

🟒  Usage

βšͺ  default

 
// [ index.tsx ]
import { RecoilRoot } from "recoil";

const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
root.render(
  <RecoilRoot>
    <App />      
  </RecoilRoot>
);
 
// [ atoms.ts ] : μƒνƒœ 관리 store
import { atom } from "recoil";

export const isDarkAtom = atom({
    key: "isDark",
    default: true,
});
 
// [ Set Atom Component ]
import { useSetRecoilState } from "recoil";
import { isDarkAtom } from "../atoms";

const Coins = () => {
  const setDarkAtom = useSetRecoilState(isDarkAtom);
  const toggleDarkAtom = () => setDarkAtom((prev) => !prev);
  return (
    <>
      <button onClick={toggleAtom}>Button</button>
    </>
  );
}
 
// [ Get Atom Component ]
import { useRecoilValue } from "recoil";
import { isDarkAtom } from "../atoms";

const Chart = () => {
  const isDark = useRecoilValue(isDarkAtom);
  return (
    <span>{isDark}</span>
  );
}

 

βšͺ  selector

 
// [ atom ]
import { atom, selector } from "recoil";

export const minuteState = atom({
    key: "minutes",
    default: 0,
});

export const hourSelector = selector<number>({
    key: "hours",
    get: ({ get }) => {
        const minutes = get(minuteState);
        return minutes / 60;
    },
    set: ({ set }, newValue) => {
        const minutes = Number(newValue) * 60;
        set(minuteState, minutes);
    },
});
 
// [ App ]
import { useRecoilState } from "recoil";
import { hourSelector, minuteState } from "./atoms";

function App() {
    const [minutes, setMinutes] = useRecoilState(minuteState);
    const [hours, setHours] = useRecoilState(hourSelector);
    const onMinutesChange = (event: React.FormEvent<HTMLInputElement>) => {
        setMinutes(+event.currentTarget.value);
    };
    const onHoursChange = (event: React.FormEvent<HTMLInputElement>) => {
        setHours(+event.currentTarget.value);
    };
    return (
        <div>
            <input value={minutes} onChange={onMinutesChange} type="number" placeholder="Minutes" />
            <input onChange={onHoursChange} value={hours} type="number" placeholder="Hours" />
        </div>
    );
}

export default App;