React Recoil

๊ณต์‹๋ฌธ์„œ

๊ฐœ์š”

  • Atom์— value๋ฅผ ๋„ฃ๊ณ  ํ•„์š”ํ•œ component๊ฐ€ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•จ

  • Traveling Prop์„ ํ•ด๊ฒฐํ•จ

RecoilRoot

  • recoil ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ ํŠธ๋ฆฌ์— RecoilRoot๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ์— RecoilRoot๋ฅผ ๋„ฃ์–ด์คŒ

Atom

  • Atom์€ **์ƒํƒœ(State)**์˜ ์ผ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ„

  • Atoms๋Š” ์–ด๋А ์ปดํฌ๋„ŒํŠธ์—์„œ๋‚˜ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Œ

  • Atom์— ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ Atom์„ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์žฌ ๋žœ๋”๋ง ๋จ

// atoms.ts

export const textstate = atom({
  key: "textState",
  // unique ID (with respect to other atoms/selectors)
  default: "",
  // default value (aka initial value)
})
  • ์ปดํฌ๋„ŒํŠธ์—์„œ atom์„ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

Hooks

  • useRecoilValue(Atom) : Atom์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜

  • useSetRecoilState(Atom) : Modifier๋ฅผ ๋ฐ˜ํ™˜

  • useRecoilState(Atom) : ๊ฐ’๊ณผ Modifier๋ฅผ ๋ฐ˜ํ™˜(setState์™€ ๊ฐ™์Œ)

...
function TextInput() {
  const [text, setText] = useRecoilState(textState);

  const onChange = (event) => {
    setText(event.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo: {text}
    </div>
  );
}

Selector

  • Selector๋Š” ํŒŒ์ƒ๋œ ์ƒํƒœ(derived state)์˜ ์ผ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ„

  • ํŒŒ์ƒ๋œ ์ƒํƒœ === ์ƒํƒœ์˜ ๋ณ€ํ™”

  • useRecoilValue(selector) hook์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ

// atoms.ts

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);
  },
});

Last updated