nomadcoder/React JS 마스터클래스

Recoil

fullfish 2023. 2. 14. 20:23
npm i recoil
// index.tsx
root.render(
  <div>
    <RecoilRoot>
      <QueryClientProvider client={queryClient}>
        <App />
      </QueryClientProvider>
    </RecoilRoot>
  </div>
)

 

atom 만들기

// src/atoms.tc
import { atom } from 'recoil'

export const isDarkAtom = atom({
  key: 'isDark', // 유일해야함
  default: true,
})

 

atom 받아오기

// src/App.tsx
const isDark = useRecoilValue(isDarkAtom)

 

atom 값 바꾸기

// coins.tsx
const setDarkAtom = useSetRecoilState(isDarkAtom)
const toggleDarkAtom = () => setDarkAtom(prev => !prev)

<button onClick={toggleDarkAtom}>Toggle Mode</button>

 

useRecoilValue와 useSetRecoilState 동시에 쓰기

const [isDark, setIsDark] = useRecoilState(toDoState)

 

selector : atom을 가져다가 output 변형가능

Selector는 파생된 state(derived state)의 일부를 나타낸다.
즉, 기존 state를 가져와서, 기존 state를 이용해 새로운 state를 만들어서 반환할 수 있다. 
기존 state를 이용만할 뿐 변형시키지 않는다. 
derived state는 다른 데이터에 의존하는 동적인 데이터를 만들 수 있기 때문에 강력한 개념이다.
export const toDoState = atom<IToDo[]>({
  key: 'toDo',
  default: [],
})
export const toDoSelector = selector({
  key: 'toDoSelector',
  get: ({ get }) => {
    console.log('get', get)
    const toDos = get(toDoState)
    return [toDos.filter(toDo => toDo.category === 'TO_DO'), toDos.filter(toDo => toDo.category === 'DOING'), toDos.filter(toDo => toDo.category === 'DONE')]
  },
})

get으로 atom을 selector로 가져옴

state 자체는 변하지 않지만 selecter가 output을 바꾼것

category는 state안의 하나의 배열에 그대로 들어있지만 output을 바꿔서 다른 배열에 있는것처럼 분기할 수 있음

'nomadcoder > React JS 마스터클래스' 카테고리의 다른 글

react-hook-form  (0) 2023.02.14
CRYPTO TRACKER 과제  (0) 2023.02.11
CRYPTO TRACKER  (0) 2023.02.10
Typescript for React  (0) 2023.02.07
Styled Components  (0) 2023.02.06