이번주 동안 마이 프로필 페이지를 만들면서 recoil을 사용해 볼 수 있는 기회가 많았다.
그래서 이번주에 알게된 recoil에 관련된 새로운 것들을 정리해 볼 예정이다.
recoil은 전역으로 관리하기 때문에 어떤 컴포넌트든 import하기 간편한 곳에 위치해 있어야 하며 관련된 파일로 모아놔야 유지보수에 용이하다.
//users.js
import { atom } from "recoil";
import { getCookie } from "../utils/cookie";
export const accountImgState = atom({
key: "accountImgState",
default: getCookie("user_img"),
});
export const accountNameState = atom({
key: "accountNameState",
default: {
lastName: "홍",
firstName: "길동",
},
});
이런식으로 선언을 해주었다면 이제 호출을 할 차례이다.
recoil의 값을 불러오거나 업데이트 하거나 하기위해서 recoil에서 제공하는 hook을 사용해야 한다.
위의 hook들은 아래 처럼 사용하면 된다.
import { useRecoilState, useSetRecoilState, useRecoilValue, useResetRecoilState } from "recoil";
import { accountNameState } from "../../../states/users";
const [accountName, setAccountName] = useRecoilState(accountNameState);
const setAccountName = useSetRecoilState(accountNameState);
const accountName = useRecoilValue(accountNameState);
const resetName = useResetRecoilState(accountNameState);
위에서 말했듯이 초기값을 객체 형태로도 할 수 있다했는데 업데이트 할 때 주의할 점이 있다.
export const accountNameState = atom({
key: "accountNameState",
default: {
lastName: "홍",
firstName: "길동",
},
});
2개의 프로퍼티가 있는데 만약 하나의 프로퍼티만 업데이트한 뒤 값을 불러온다면 업데이트된 프로퍼티 1개, 초기값인 프로퍼티 1개가 반환되는 것이 아니라 업데이트된 프로퍼티만 반환을 하게된다.
setAccountName( {firstName: "길순"} )
console.log(accountName)
// {firstName: "길순"} ✅
// {lastName: "홍",firstName: "길순"}❌
props, state의 한계를 recoil로 전부 해결할 수 있어서 너무 좋았고 작업 속도 또한 굉장히 빨라졌다. 앞으로 꾸준히 계속 사용할 것 같다!