๐ŸณReact | Recoil ์‚ฌ์šฉํ•˜๊ธฐ

์›์˜ยท2023๋…„ 7์›” 10์ผ
1

์ƒˆ๋กœ์šด ์ง€์‹๐Ÿ’ก

๋ชฉ๋ก ๋ณด๊ธฐ
8/15
post-thumbnail

๐Ÿ”ŽRecoil

  • React ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์„ค๋ช…)
  • ์ „์—ญ ์ƒํƒœ๋กœ Atom๊ณผ Selector๊ฐ€ ์žˆ์Œ

๐Ÿ’กAtom

  • Recoil์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ƒํƒœ ๋‹จ์œ„
  • key, default ๋กœ ๊ตฌ์„ฑ
    key : ๋ณดํ†ต atom์˜ ์ด๋ฆ„, ์ „์—ญ์ ์œผ๋กœ ์œ ์ผํ•œ ๊ฐ’
    default : ๊ฐ’

์˜ˆ์‹œ

export const ExAtom = atom({
    key: 'ํ‚ค๊ฐ’',
    default: ๊ฐ’
  })

์‚ฌ์šฉ๋ฐฉ๋ฒ•

  • atom ๋ถˆ๋Ÿฌ์˜ฌ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  atom import
  • useRecoilState์‚ฌ์šฉํ•ด useState์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉ
const [value, setValue] = useRecoilState(ExAtom)
  • useRecoilValue : ๊ฐ’๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
const value = useRecoilValue(ExAtom)
  • useSetRecoilState : ๋ณ€๊ฒฝํ•จ์ˆ˜๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
const setValue = useSetRecoilState(ExAtom)

๐Ÿ’กSelector

  • Atom์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ƒ๋œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • key, get, set ์œผ๋กœ ๊ตฌ์„ฑ
    key : (๋ณดํ†ต) ์•„ํ†ฐ์˜ ์ด๋ฆ„, ์ „์—ญ์ ์œผ๋กœ ์œ ์ผํ•œ ๊ฐ’
    get : ์›๋ณธ state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š๊ณ  ์›ํ•˜๋Š” ๊ฐ’ ๊ฐ€์ ธ์˜ด
    set : ์›๋ณธ state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ

์˜ˆ์‹œ

export const ExSelector = selector({
 key: 'ํ‚ค๊ฐ’',
 get: ({get}) => {
  const ์›๋ณธ = get(ExAtom)
  return ์›๋ณธ์„_๋กœ์งํ†ตํ•ด_๋ณ€ํ˜•ํ•œ๊ฐ’
 }
 set: ({set}, ์ธ์ž๋กœ_๋ฐ›์•„์˜จ๊ฐ’) => {
  const ๋ณ€๊ฒฝํ• _์ƒˆ๋กœ์šด๊ฐ’ = ์ธ์ž๋กœ_๋ฐ›์•„์˜จ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜๋Š”๋กœ์ง
  set(ExAtom, ๋ณ€๊ฒฝํ• _์ƒˆ๋กœ์šด๊ฐ’)
 }
})

์‚ฌ์šฉ๋ฐฉ๋ฒ•

  • selector ๋ถˆ๋Ÿฌ์˜ฌ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  selector import
    atom๊ณผ ๊ฐ™์ด useRecoilState, useRecoilValue, useSetRecoilState ์‚ฌ์šฉ

  // ํ•œ๋ฒˆ์— ์„ ์–ธํ•˜๊ธฐ
  const [selector, setSelector] = useRecoilState(ExSelector)
  
  // get ๊ฒฐ๊ณผ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
  const get_๊ฒฐ๊ณผ๊ฐ’_๊ฐ€์ ธ์˜ค๊ธฐ = useRecoilValue(ExSelector)
  
  // set ๊ธฐ์กด๊ฐ’์—์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
  const set_๊ธฐ์กด๊ฐ’_๋ณ€๊ฒฝํ•˜๊ธฐ = useSetRecoilState(ExSelector)
  
  // ์œ„ ์ฝ”๋“œ๋“ค์—์„œ ๋‹ค์Œ์€ ๊ฐ™์€ ๊ฐ’
  // selector = get_๊ฒฐ๊ณผ๊ฐ’_๊ฐ€์ ธ์˜ค๊ธฐ
  // setSelector(์ธ์ž) = set_๊ธฐ์กด๊ฐ’_๋ณ€๊ฒฝํ•˜๊ธฐ(์ธ์ž)

๐Ÿ’ก์ ์šฉ์‹œ์ผœ๋ณด๊ธฐ - ์ฝ”๋“œ

UserAtom.js

import { atom, selector } from 'recoil';

export const myNewAtom = atom({
  key: 'myNewAtom',
  default: 0,
});

export const myNewSelector = selector({
  key: 'myNewSelector',
  get: ({ get }) => {
    const ์›๋ณธ = get(myNewAtom);
    return ์›๋ณธ + 10;
  },
  set: ({ set }, ์ธ์ž๋กœ_๋ฐ›์•„์˜จ๊ฐ’) => {
    const ๋ณ€๊ฒฝํ• _์ƒˆ๋กœ์šด๊ฐ’ = Number(์ธ์ž๋กœ_๋ฐ›์•„์˜จ๊ฐ’) + 10;
    set(myNewAtom, ๋ณ€๊ฒฝํ• _์ƒˆ๋กœ์šด๊ฐ’);
  },
});

App.js

import { useRecoilState } from 'recoil';
import { myNewAtom, myNewSelector } from './recoil/UserAtom';

export default function App() {
  const [atom, setAtom] = useRecoilState(myNewAtom);
  const [selector, setSelector] = useRecoilState(myNewSelector);

  return (
    <>
    // ๋ฒ„ํŠผ1 : ํ˜„์žฌ atom๊ฐ’ ๋ณด์—ฌ์ฃผ๋Š” ๋ฒ„ํŠผ
      <button onClick={() => {
        console.log('ํ˜„์žฌ atom : ' + atom);
      }}>
        ํ˜„์žฌ atom ๊ฐ’ ๋ณด๊ธฐ
        <div>์ฝ”๋“œ: atom</div>
      </button>

	// ๋ฒ„ํŠผ2 : setAtom() ํ†ตํ•ด์„œ atom๊ฐ’ 1 ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฒ„ํŠผ
      <button onClick={() => {
        setAtom((prev) => prev + 1);
        console.log('atom๊ฐ’ +1');
      }}>
        atom๊ฐ’ ๋ฐ”๊พธ๊ธฐ (+1)
        <div>์ฝ”๋“œ: setAtom((prev) => prev + 1)</div>
      </button>

	// ๋ฒ„ํŠผ3 : get ํ†ตํ•ด์„œ ์›๋ณธ atom๊ฐ’ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š๊ณ  ์›๋ณธ๊ฐ’์—์„œ 10 ์ฆ๊ฐ€ํ•œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๋Š” ๋ฒ„ํŠผ
      <button onClick={() => {
        console.log('selector์—์„œ ํ˜„์žฌ atom ๊ฐ€์ ธ์™€ ๋ณ€ํ˜•ํ•œ ๊ฐ’ : ' + selector);
        console.log("'ํ˜„์žฌ atom ๊ฐ’ ๋ณด๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋ณด์„ธ์š”");
      }}>
        get ์ด์šฉํ•ด selector์— ์—ฐ๊ฒฐ๋œ atom์˜ ์›๋ž˜๊ฐ’ ๋ณ€๊ฒฝํ•˜์ง€์•Š๊ณ , ๋ณ€ํ˜•ํ•œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ (+10)
        <div>์ฝ”๋“œ: selector</div>
      </button>

	// ๋ฒ„ํŠผ4 : set ํ†ตํ•ด์„œ ์›๋ณธ atom๊ฐ’์„ 10 ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฒ„ํŠผ
      <button onClick={() => {
        setSelector(atom);
        console.log('setSelector(์ธ์ž)์—์„œ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๊ฐ’ + 10');
        console.log("'ํ˜„์žฌ atom ๊ฐ’ ๋ณด๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋ณด์„ธ์š”");
      }}>
        set ์ด์šฉํ•ด selector์— ์—ฐ๊ฒฐ๋œ atom์˜ ์›๋ž˜๊ฐ’์˜ ๋ณ€๊ฒฝํ•˜๊ธฐ (+10)
        <div>์ฝ”๋“œ: setSelector(atom)</div>
      </button>
    </>
  );
}

๐Ÿ’ก์ ์šฉ์‹œ์ผœ๋ณด๊ธฐ - ๊ฒฐ๊ณผ

  1. setAtom() ํ†ตํ•ด์„œ atom๊ฐ’ 1์ฆ๊ฐ€์‹œํ‚ค๊ธฐ
  2. get ํ†ตํ•ด์„œ ์›๋ณธ atom๊ฐ’ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š๊ณ  ์›๋ณธ๊ฐ’์—์„œ 10 ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ
  3. set ํ†ตํ•ด์„œ ์›๋ณธ atom๊ฐ’์„ 10 ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฒ„ํŠผ
profile
ํ™”์ดํŒ…~~^ใ…^/

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