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 를 생성해서 사용할 컴포넌트에서 상태값을 불러오고 공유시켜 반환시킬 수 있다니. 좀 더 익숙해질 수 있도록 해봐야겠다.