(react 공식문서 중)
key를 사용해 React가 모든 컴포넌트를 구분하도록 할 수 있습니다. 기본적으로 React는 부모 내의 순서(“첫 번째 counter”, “두 번째 counter”)를 사용해 컴포넌트를 구분합니다. 하지만 key를 사용하면 이것이 첫 번째 counter나 두 번째 counter가 아니라 특정 counter(예: Taylor의 counter)임을 React에 알릴 수 있습니다. 이렇게 하면 React는 테일러의 counter가 트리에 어디에 나타나든 알 수 있습니다!{isPlayerA ? ( <Counter key="Taylor" person="Taylor" /> ) : ( <Counter key="Sarah" person="Sarah" /> )}
이걸 활용하여 프로젝트에 적용했다 !
기존에 팀원분이 시도했다 말았던 부분이 있었다. 각 탭을 누르면 탭 정보를 localStorage
에 저장한다.
const onChange = (key: string) => {
localStorage.setItem("tabs", key);
};
새로고침 시 처음 useEffect
를 통해 localStorage
에서 get 해오고, 해당 value에 따라 defaultActiveKey
를 변경해준다.
defalutActiveKey
는 antd 에서 제공하는 value이다. const [tabValue, setTabValue] = useRecoilState(detailTabMenu);
return
{tabValue ? (
<Tabs
defaultActiveKey={tabValue}
items={items}
onChange={onChange}
/>
) : (
<Tabs
defaultActiveKey="1"
items={items}
onChange={onChange}
/>
)}
localStorage
에 각 상태를 저장하는게 아니라 강의소개, 강의목록 전체를 공유하는 값으로 저장했기 때문이다.useRecoliState
→ useState
로 변경 const [tabValue, setTabValue] = useState("");
routing
기능을 활용하여 쿼리스트링 값을 준다. const onChange = (key: string) => {
setTabValue(key);
localStorage.setItem("tabs", key);
router.push(`/courses/courses-list/${router.query.slug}?tab=#${key}`);
};
{tabValue ? (
<Tabs
defaultActiveKey={tabValue}
items={items}
onChange={onChange}
key={tabValue}
/>
) : (
<Tabs
defaultActiveKey="introduce"
items={items}
onChange={onChange}
key={tabValue}
/>
)}
useEffect
에 router.asPath를 dependency로 넘겨주어 tabValue에 넘겨준다. useEffect(() => {
if (router.asPath.split("?tab=#")) {
const isTabValue = router.asPath.split("?tab=#")[1];
setTabValue(isTabValue);
}
}, [router.asPath]);