Recoil Selector

๋ฆฌ์ถฉ๋…•ยท2024๋…„ 1์›” 27์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
28/29

๐Ÿ“‹ Selector

๊ธฐ์กด์— ์„ ์–ธํ•œ atom์„ ์ „/ํ›„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด atom์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ฐธ์กฐํ•œ atom์˜ ๊ฐ’์ด ์ตœ์‹ ํ™”๋˜๋ฉด ์ž๋™์œผ๋กœ selector์˜ ๊ฐ’๋„ ์ตœ์‹ ํ™”ํ•˜๋ฏ€๋กœ, ๊ด€๋ฆฌํ•˜๊ธฐ์—๋„ ๊ฐ„ํŽธํ•˜๋‹ค.


get

ํ‚ค๊ฐ’์œผ๋กœ selector๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” id์ธ key, selector์˜ value๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” get ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

selector์˜ ์š”์ ์€ get function์„ ํ†ตํ•ด atom์„ ๊ฐ€์ ธ์™€ ์ƒํƒœ๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

get ํ•จ์ˆ˜๋Š” options๋ผ๋Š” ์ธ์ž๋ฅผ ๋ฐ›์œผ๋ฉฐ ํ˜ธ์ถœ๋˜๋Š”๋ฐ options๋Š” ๊ฐ์ฒด๋กœ ๋‚ด๋ถ€์— get function์ด ๋“ค์–ด์žˆ๋‹ค.

๊ฐ์ฒด ๋‚ด๋ถ€์˜ get function์„ ์‚ฌ์šฉํ•ด selector ๋‚ด๋ถ€๋กœ atom์„ ๊ฐ–๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด get()์„ ํ†ตํ•ด atom์„ ๊ฐ€์ ธ์˜ด์œผ๋กœ์จ seletor๋Š” atom์„ ๋ณด๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

atom์ด ๋ณ€๊ฒฝ๋˜๋ฉด seletor ๋˜ํ•œ ๋ณ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฆฌํ„ด๋œ selecor ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ useRecoilValue()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.


set

์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

state๋ฅผ ํŠน์ • ๊ฐ’์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” state๋ฅผ ์ˆ˜์ •ํ•  set function, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” newValue ์ด๋‹ค.

atom๊ณผ ๋™์ผํ•˜๊ฒŒ useRecoilState๋ฅผ selector๋กœ ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ ๋ฐฐ์—ด์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” get function์œผ๋กœ ๋ถ€ํ„ฐ ๋ฆฌํ„ดํ•œ ๊ฐ’์ด๋ฉฐ, ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋Š” selector์˜ set property๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” set ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.

atom, selector ๋ชจ๋‘ useRecoilState๋ฅผ ํ†ตํ•ด ๊ฐ’ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.


๋ถ„์€ ์‹œ๊ฐ„์œผ๋กœ, ์‹œ๊ฐ„์€ ๋ถ„์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

๋ถ„๊ณผ ์‹œ๊ฐ„์„ ์ž…๋ ฅํ•  input ํƒœ๊ทธ์™€ ์ž…๋ ฅ๊ฐ’์˜ value๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ atom์„ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค.

// ์ž…๋ ฅ๊ฐ’ state
import { atom } from "recoil";

export const minuteState = atom<number>({
  key: "minute",
  default: 0,
});


// ๋ถ„ -> ์‹œ๊ฐ„, ์‹œ๊ฐ„ -> ๋ถ„ ๋ณ€ํ™˜
export const convertMinuteSelector = selector<number>({
  key: "minuteToHour",
  get: ({ get }) => {
    const minute = get(minuteState);

    return minute / 60;
  },
  set: ({ set }, newMinute) => {
    const minute = Number(newMinute) * 60;

    set(minuteState, minute);
  },
});

์œ„ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด set function์˜ ๋‘๋ฒˆ ์งธ ์ธ์ž๋กœ newValue๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ๊ฐ’์„ newValue๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ 

๋…ธ๋งˆ๋“œ์ฝ”๋”

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