npm install recoil;
import { atom, selector } from "recoil";
//CartItem.js
//장바구니에 담기는 아이템
export const CartAtom = atom({
  key: "CartAtom",
  default: [],
});
//Cart.tsx
import {useRecoilState, useRecoilValue} from "recoil";
function Cart(){
  //state
	const [cartItem, setCartItem] = useRecoilState(CartAtom);
  //value
  const carItem = useRecoilValue(CartAtom);
}
useRecoilState hook 을 통해 상태값을 공유할 수 있다.useRecoilValue hook 도 있다.export const Selector = selector({
	key: '키값',
  	get: ({get}) => {
      const dnjsqhs = get(아톰)
      return 원본 변형값
    }
})
//CartItem.js
//장바구니 아이템의 총 수량 selector
export const QuantitySelector = selecotr({
	key: 'QuantitySelector',
  	get: ({get}) => {
      const CurrentItem = get(CartItem);
      return CurrentItem.length.toLocaleString();
    },
});
//장바구니 아이템의 총 가격 selector
export const TotalPriceSelector = selector({
	key: 'TotalPriceSelector',
  	get: ({get}) => {
    	const CurrentItem = get(CartItem);
      	return CurrentItem.reduce(
          (acc, cur) => acc + cur.price, 0
         ).toLocaleString();
    },
});
//Cart.tsx
import {useRecoilState, useRecoilValue} from "recoil";
function Cart(){
  const TotalQuantity = useRecoilValue(QuantitySelector);
  const TotalPrice = useRecoilValue(TotalPriceSelector);
}
useRecoilValue() hook 을 사용하여 하나의 atom이나 selector 를 인자로 받아 대응하는 값을 반환한다.
 // 아톰 불러오기
  const [cartItem, setCartItem] = useRecoilState(CartAtom);
  // 이미 장바구니에 들어있는지 확인
  const isAlreadyInCart = cartItem.filter((e) => e.id === id).length;
  /**
   * 장바구니에 있는지 확인후, 없을때만 아톰에 추가
   */
  const AddToCart = () => {
    if (!isAlreadyInCart) {
      // spread operator 를 사용하여 원본 배열을 깊은 복사 후 추가
      setCartItem((prev) => [...prev, data]);
    }
  };

useRecoilValue() 로 상태 값을 가져와 map 으로 나열시킬 수 있다.useSetRecoilState() hook 을 사용하여 상태값을 변경/삭제시킬 수 있다.  const setCartItem = useSetRecoilState(CartAtom);
  const removeFromCart = () => {
    setCartItem((prev) => prev.filter((e) => e.id !== id));
  };
Redux 에서 Redux-Toolkit 로 변형해서 사용하면서 꽤 신선하다고 생각했는데, Recoil 에 대해 배우니 더 충격적이다. 너무나도 간단히 Atom 과 selector 를 생성해서 사용할 컴포넌트에서 상태값을 불러오고 공유시켜 반환시킬 수 있다니. 좀 더 익숙해질 수 있도록 해봐야겠다.