1) 상태관리를 지정할 때 atom
const [cartItem, setCartItem] = useRecoilState(CartItemAtom)
//값만 사용하는 경우
const state = useReoilValue('값')
//set함수만 사용하는 경우
const setState = useSetRecoilState('값')
상태가 위치할 곳 atom이 떠있을 자리를 설정해줘야 한다.
3) setState함수
배열, 객체와 같은 참조자료형을 사용할 때 원본을 copy 하고 써야함
만약 push 하는 경우 원본데이터마저 변하게 됨
setCartItem = ((prev) => [...prev, data])
// 해당 아이템이 장바구니에 있으면 눌리지 못하게 하기 전에 그 여부를 구분하는 함수
const isAlreadyInCart = cartItem.filter((e) => e.id === id).length
const isAlreayInCart = cartItem.findindex((e) => e.id === id).!== -1
4) selector
const TotalQuantity = cartItem.lenth;
const
hook 을 이용하여 기존 class 바탕의 코드를 작성할 필요없이 상태값과 여러 react 기능을 사용할 수 있게 되었다.
react의 hooks와 어울리면서 react에 필요한 것들만 react스럽게 제작한 상태관리 라이브러리
yarn add recoil
yarn을 이용하여 recoil 패키지 설치
import React from 'react';
import {
RecoilRoot,
atom,
selector,
useRecoilState,
useRecoilValue
} from 'recoil';
function App(){
return(
<RecoilRoot>
<CharacterCounter />
</RecoilRoot>
)
}
recoil state를 사용할 컴포넌트는 RecoilRoot태그로 감싸주어야 한다.
const textState = atom({
key: 'textState',
default: '',
})
key는 unique ID로 다른 atom 및 selector 와 구별하기 위함에 있다.
default value는 initial value로 초기값이다.
atom은 기존의 상태관리 라이브러리에서 쓰이는 store와 유사한 개념으로 상태의 단위이다
atom이 업데이트 되면 atom을 구독하고 있던 모든 컴포넌트들의 state가 새로운 값으로 리렌더된다.
unique한 id인 key로 구분되는 각 atom은 여러 컴포넌트에서 atom을 구독하고 있다면 그 컴포넌트들도 똑같은 상태를 공유한다.
function CharacterCounter(){
return(
<div>
<TextInput />
<CharacterCount />
</div>
);
}
function TextInput() {
const [text,setText] = useRecoilState(textState);
const onChange = (event) => {
setText(event.target.value);
};
return(
<div>
<input type="text" value={text} onChange={onChange} />
<br/>
Echo : {text}
</div>
)
}
useRecoilState hook 는 atom의 state를 get하거나 set할 수 있다
const [text, setText] = useRecoilState(textState);
다음과 같이 사용하면 text는 textState의 value를 가지게 되고 (get) setTExt는 text의 값을 변경할 수 있다 (set)
function TextInput(){
const text = useRecoilValue(textState);
const setText = useSetRecoilValue(textState);
const onChange = (event) => {
setText(event.target.value);
};
}