아무래도 프론트엔드적인 공부를 하다보면 계속해서 마주칠 수 밖에 없는 문제인데,
새로고침하면서 모든 내역들이 다 사라진다는 점이 계속해서 화이트 아웃 현상을 발생시켰다.
사실 이 부분에 대한 현상을 어쩔 수 없다는 식의 생각만 하고 있었는데,
오늘 기술매니저님께서 프론트엔드적인 사고법을 알려주셨다.
무조건 오류가 난다고 가만히 있는게 아니라,
오류가 났을 때 가장 사용자-친화적으로 돌아갈 수 있는 예외케이스 값을 주어주면 가장 좋다고 하셨다.
function Under_todo() {
const reducer = useSelector((state)=> state.reducer);
const param = useParams();
const newObj = reducer.find((item) => item.id === +param.id)
return (
<StTemplate>
<StHeader>
ID : { newObj.id }
<Link to={`/`}>
<StItemBtn style={{ cursor: 'pointer' }}> <FaHome/> </StItemBtn>
</Link>
</StHeader>
<StMain>
<StLabel> Title : { newObj.title }</StLabel>
<StLabel style={{fontWeight : 'lighter'}}> To-do : { newObj.todo }</StLabel>
</StMain>
</StTemplate>
)
}
여러가지 값을 저장한 다음에 하위페이지에서 새로고침을 하게되면,
useSelector 부분에서 애초에 그 값을 가져오지 못하게 되는 것이었다.
param의 경우에는 주소값을 가져오기 때문에 지정된 주소값을 가져오지만,
해당 객체에 할당된 ID 값은 어디 서버에 저장해 둔 것이 아니기 때문에 새로고침하면 사라진다.
그래서 undefined가 될 수 밖에 없고,
그래서 이에 따라 밑에 화면이 그려질 때 해당 객체에 맞는 ID 값, Title값 모두 가져올 것 조차 없게 된 것이다.
function Under_todo() {
const reducer = useSelector((state)=> state.reducer);
const param = useParams();
const newObj = reducer.find((item) => item.id === +param.id)
return (
<StTemplate>
<StHeader>
ID : { newObj?.id }
<Link to={`/`}>
<StItemBtn style={{ cursor: 'pointer' }}> <FaHome/> </StItemBtn>
</Link>
</StHeader>
<StMain>
<StLabel> Title : { newObj?.title }</StLabel>
<StLabel style={{fontWeight : 'lighter'}}> To-do : { newObj?.todo }</StLabel>
</StMain>
</StTemplate>
)
}
그치만 위의 상황에서 보다 조금 더 사용자 친화적으로 바꿀 수 있는데,
만약 그 값이 없다면,
undefined로 도배된 하위페이지를 보는 것보다,
그냥 다시 Home으로 돌아오는 것이 나은 방법으로 보여진다.
import { useNavigate } from 'react-router-dom';
function Under_todo() {
const navigate = useNavigate();
const reducer = useSelector((state)=> state.reducer);
const param = useParams();
const newObj = reducer.find((item) => item.id === +param.id)
useEffect(()=>{
if(newObj === undefined){
navigate('/')
}
},[]);
return (
<StTemplate>
<StHeader>
ID : { newObj?.id }
<Link to={`/`}>
<StItemBtn style={{ cursor: 'pointer' }}> <FaHome/> </StItemBtn>
</Link>
</StHeader>
<StMain>
<StLabel> Title : { newObj?.title }</StLabel>
<StLabel style={{fontWeight : 'lighter'}}> To-do : { newObj?.todo }</StLabel>
</StMain>
</StTemplate>
)
}
그 후에는 react-router-dom의 훅인 useNavigate()를 만들어서,
Home으로 이동하는 훅을 추가해주면 완성이다.