Recoil

suminยท2022๋…„ 10์›” 22์ผ
0

๐Ÿ’ก ๋ฆฌ์ฝ”์ผ ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ ํ•˜์—ฌ ์ •๋ฆฌ ๋ฐ ๊ณต๋ถ€


๊ฐœ๋…

Atoms(๊ณต์œ  ์ƒํƒœ)

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์˜ ๋‹จ์œ„
  • atom ์—…๋ฐ์ดํŠธ -> ๊ฐ๊ฐ์˜ ๊ตฌ๋…๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง
  • ๋Ÿฐํ…Œ์ž„์—์„œ ์ƒ์„ฑ๋  ์ˆ˜๋„ ์žˆ์Œ
  • atom ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ

๊ณ ์œ ํ•œ key๊ฐ’๊ณผ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง

const fontSizeState = atom({
  key: 'fontSizeState',
  default: 14,
});

useRecoilState hook

  • useState์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ƒํƒœ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ
function FontButton() {
  const [fontSize, setFontSize] = useRecoilState(fontSizeState);
  return (
    <button onClick={() => setFontSize((size) => size + 1)} style={{fontSize}}>
      Click to Enlarge
    </button>
  );
}

Selectors(์ˆœ์ˆ˜ ํ•จ์ˆ˜)

  • atoms ์ƒํƒœ๊ฐ’์„ ๋™๊ธฐ ๋˜๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ณ€ํ™˜

  • ์ƒ์œ„์˜ atoms ๋˜๋Š” selectors๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด ํ•˜์œ„์˜ selector ํ•จ์ˆ˜๋„ ๋‹ค์‹œ ์‹คํ–‰

  • atoms์ฒ˜๋Ÿผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, selectors๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง

  • ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํŒŒ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • ์ตœ์†Œํ•œ์˜ ์ƒํƒœ๋งŒ atoms์— ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค์€ selectors ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•จ์œผ๋กœ์จ ์“ธ๋ชจ์—†๋Š” ์ƒํƒœ์˜ ๋ณด์กด์„ ๋ฐฉ์ง€

const fontSizeLabelState = selector({
  key: 'fontSizeLabelState',
  // get : ๊ณ„์‚ฐ๋  ํ•จ์ˆ˜
  get: ({get}) => {
    const fontSize = get(fontSizeState);
    const unit = 'px';

    return `${fontSize}${unit}`;
  },
});

useRecoilValue() : ํ•˜๋‚˜์˜ atom์ด๋‚˜ selector๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋ฐ˜ํ™˜

function FontButton() {
  const [fontSize, setFontSize] = useRecoilState(fontSizeState);
  const fontSizeLabel = useRecoilValue(fontSizeLabelState);

  return (
    <>
      <div>Current font size: ${fontSizeLabel}</div>

      <button onClick={setFontSize(fontSize + 1)} style={{fontSize}}>
        Click to Enlarge
      </button>
    </>
  );
}

์ ์šฉ

์ „์— ์ž‘์„ฑํ•œ [TypeScript] ๋ณ‘์› ์˜ˆ์•ฝ ์‹œ์Šคํ…œ ๊ตฌํ˜„์—์„œ ์‚ฌ์šฉ๋œ recoil ์ •๋ฆฌ

(1) recoil ์ƒํƒœ๋ฅผ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ์— ๋„ฃ์–ด Main ์ปดํฌ๋„ŒํŠธ์— ์ ์šฉ

import { RecoilRoot } from 'recoil';

function App() {
  return (
    <ThemeProvider theme={theme}>
      <GlobalStyle />
      <Layout>
        <RecoilRoot>
          <Main />
        </RecoilRoot>
      </Layout>
    </ThemeProvider>
  );
}

(2) ๋™์ผํ•œ ์ƒํƒœ ๊ฐ’์„ ์บ˜๋ฆฐ๋” / ์˜ˆ์•ฝ / ์กฐํšŒ์— ์‚ฌ์šฉํ•จ์œผ๋กœ globalState๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ atom() ํ•จ์ˆ˜ ์ƒ์„ฑ

// atom.ts
export const globalState = atom<DefaultType[]>({
  key: 'globalState',
  default: [],
});

(3) Main ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งˆ์šดํŠธ ์‹œ useSetRecoilState() ํ›…์œผ๋กœ globalState ์—…๋ฐ์ดํŠธ

ํ•ด๋‹น state๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ

const Main = () => {
  const setGlobalAtom = useSetRecoilState(globalState);

  useEffect(() => {
    setGlobalAtom(DATA.data);
  }, []);

  return (
    <Wapper>
      <Calendar />
    </Wapper>
  );
};

export default Main;
// DATA ํ˜•ํƒœ
const DATA = {
  data: [
    {
      id: 220101,
      user_name: 'ํ™๊ธธ๋™',
      user_phone: '010-3286-6377',
      booking_date: '2022-10-17',
      booking_time: '16:00',
      categories: '๊ฒ€์ง„',
    },
    ...
  ]
}

(4) ์˜ˆ์•ฝ ์ •๋ณด(globalState)๋ฅผ Calender์—์„œ ์˜ˆ์•ฝ ์กฐํšŒ/๋“ฑ๋ก์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— useRecoilValue()ํ›…์œผ๋กœ globalState๋ฅผ ์ ์šฉ

// Calendar.tsx
const reserved = useRecoilValue(globalState);
const Data = reserved.map(function (item) {
  const obj = {
    title: `${item.booking_time} ${item.user_name} ${item.categories}`,
    start: item.booking_date,
    end: item.booking_date,
  };
  return obj;
});

(5) fullcalendar ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌํ˜„ํ•œ Calendar์— Data ์ ์šฉ

// Calendar.tsx
<FullCalendar
  locale={'ko'}
  plugins={[dayGridPlugin, interactionPlugin]}
  dayMaxEventRows={true}
  events={Data}
  eventColor="#EFB33F"
  selectable={true}
  dateClick={(info: DateClickArg) => {
    setSelectDate(info.dateStr);
    reserveHandler();
  }}
/>

0๊ฐœ์˜ ๋Œ“๊ธ€