[React] ๐Ÿ’Recoil ์‚ฌ์šฉ๋ฒ•

TATAยท2023๋…„ 6์›” 16์ผ
0

React

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

โ–ท Recoil

๊ฐ„ํŽธํ•˜๊ณ  ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋„์™€์ฃผ๋Š” Recoil์€
atom๊ณผ selector, ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ƒํƒœ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

atom: ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์ •์˜
selector: ๋‹ค๋ฅธ ์ƒํƒœ์˜ ํŒŒ์ƒ ๊ฐ’์ด๋‚˜ ๋ณ€ํ™˜๋œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

๐Ÿ’ ์„ค์น˜

npm install recoil

๐Ÿ’ RecoilRoot

index.js

// RecoilRoot ๊ฐ€์ ธ์˜ค๊ธฐ
import { RecoilRoot } from "recoil";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <RecoilRoot>  // ์ถ”๊ฐ€
      <App />
    </RecoilRoot> // ์ถ”๊ฐ€
  </React.StrictMode>
);

๐Ÿ’ atom

atom/usernameState.js

// atom ๊ฐ€์ ธ์˜ค๊ธฐ
import { atom } from "recoil";

const usernameState = atom({
  key: "usernameState",
  default: "tata",
});

export default usernameState;

๐Ÿ’ selector

get ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

selector/nameLengthState.js

// selector ๊ฐ€์ ธ์˜ค๊ธฐ
import { selector } from "recoil";

import usernameState from "../atom/usernameState";

const nameLengthState = selector({
  key: "nameLengthState",
  get: ({ get }) => {
    const username = get(usernameState);
    return username.length;
  },
});

export default nameLengthState;

๐Ÿ’ useRecoilState, useRecoilValue

useRecoilState: useState์ฒ˜๋Ÿผ ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝ๋„ ๊ฐ€๋Šฅ
useRecoilValue: ์ƒํƒœ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ

import { useRecoilState, useRecoilValue } from "recoil";
import nameState from "../atom/usernameState";
import nameLengthState from "../selector/nameLengthState";

const Main = () => {
  const [username, setUsername] = useRecoilState(nameState);

  const name = useRecoilValue(nameState);
  const nameLength = useRecoilValue(nameLengthState);

  const changeName = () => {
    setUsername("chimmy");
  };

  const resetName = () => {
    setUsername("tata");
  };

  return (
    <>
      <span>{username}</span>
      <button onClick={changeName}>Change Name</button>
      <button onClick={resetName}>Reset</button>
      <p>{name}</p>
      <p>{nameLength}</p>
    </>
  );
};

export default Main;


๐Ÿ’ useSetRecoilState, useResetRecoilState

useSetRecoilState: ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
useResetRecoilState: ๋””ํดํŠธ ์ƒํƒœ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ

import { useSetRecoilState, useResetRecoilState, useRecoilValue } from "recoil";
import nameState from "../atom/usernameState";

const Main = () => {
  const username = useRecoilValue(nameState);

  const resetName = useResetRecoilState(nameState); // ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  const change = useSetRecoilState(nameState); // ๋””ํดํŠธ ์ƒํƒœ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ

  const changeName = () => {
    change("chimmy");
  };

  return (
    <>
      <span>{username}</span>
      <button onClick={changeName}>Change Name</button>
      <button onClick={resetName}>Reset</button>
    </>
  );
};

export default Main;

useSetRecoilState๋กœ๋งŒ ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝํ•  ๋•Œ

/* atom/infoState.js */
import { atom } from 'recoil';

const defaultValue = {
  info2: '',
  info4: '',
  date: '',
  info5: '',
  info6: [],
};

const infoState = atom({
  key: 'infoState',
  default: defaultValue,
});

export default infoState;
/* Title.jsx */
import { useSetRecoilState } from 'recoil';

function Title() {
  const setInfoState = useSetRecoilState(infoState);

  const handleInputChange = (e) => {
    const value = e.target.value;
      
    setInfoState((data) => ({ ...data, info2: value }));
  };
...
profile
๐Ÿพ

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