스탠다드반 11차 강의
팀프로젝트 진행
└ 로그인
└ 유효성 검사 / 오류처리
└ 유저정보 저장
└ profilePage 만들기
└ 닉네임 수정
navigate('login')
처럼 / 없이 설정하면 상대경로로 이동해서🔽 맞는 코드 🔽
const handleToLoginButtonClick = (e) => {
navigate('/login');
};
몰랐던 다양한 input type이 있어서 찾아봤다
날짜도 월, 주간, 시간으로 따로 지정할 수 있다니.. 😯
<input type='color' />
<input type='date' />
<input type='datetime-local' />
<input type='file' />
<input type='image' />
<input type='month' />
<input type='range' />
<input type='time' />
<input type='url' />
<input type='week' />
// 리렌더링 만을 위한 state
const Home = () => {
const [isRender, setIsRender] = useState(false);
const handleLogoutButtonClick = () => {
// localstorage 비우기
localStorage.removeItem('accessToken');
localStorage.removeItem('nickname');
// 상태를 변화시켜서 리렌더링
setIsRender((prev) => !prev);
};
}
로그인 성공하고 리덕스에 저장하는 것까지는 하겠는데
그 다음 isLogin 처리가 왜이렇게 어려운지 모르겠다 ㅠㅠ
백엔드가 있으면 애초에 이렇게 처리 안하겠지만 그래도 알고 있어야하는데..
이해할 때까지 계속계속 머리에 욱여넣어야지 😡
그냥 내가 이해한 대로 줄줄 써보는 글
서버에서 받아온 로그인 정보를 리덕스에 넣어도 새로고침하면 리셋되는 문제가 있음
이를 막기 위해 localStorage에 필요한 정보들을 저장
대표적으로 accessToken 외에 다른 컴포넌트에서 가져다 쓸 유저 정보도 (dispatch(login)
할 때) 저장
리듀서의 초기값(=initialState)으로 서버에서 받아온 user 정보에서 사용할 정보 + isLogin 을 넣어놓고
localStorage에 accessToken 유무로 로그인 상태 저장
(undefined인 경우를 대비해(falsy) !!accessToken으로 처리해줌)
isLogin: !!accesccToken
서버에서 받아온 정보를 저장하면서 state에도 업데이트 해줌
그런 다음 새로고침을 하면 initialState가 localStorage에서 불러온 값을 사용하기 때문에
유저정보를 간직할 수 있게 됨
import {createSlice} from '@reduxjs/toolkit';
const initialState = {
// 0, 4 - 초기값 & 저장된 값 불러오기
isLogin: !!localStorage.getItem('accessToken'),
displayName: localStorage.getItem('displayName'),
uid: localStorage.getItem('uid'),
photoURL: localStorage.getItem('photoURL'),
email: localStorage.getItem('email'),
};
const AuthSlice = createSlice({
name: 'auth',
initialState,
reducers: {
// 1 - dispatch
login: (state, action) => {
const {displayName, uid, photoURL, email} = action.payload;
// 2 - 저장
localStorage.setItem('displayName', displayName);
localStorage.setItem('uid', uid);
localStorage.setItem('photoURL', photoURL);
localStorage.setItem('email', email);
// 3 - state에 업데이트
state.isLogin = true;
state.displayName = displayName;
state.uid = uid;
state.photoURL = photoURL;
state.email = email;
},
logout: (state, action) => {
localStorage.clear();
return (state = {});
},
updateNickname: (state, action) => {
localStorage.setItem('displayName', action.payload);
state.displayName = action.payload;
},
},
});
export const {login, logout, updateNickname} = AuthSlice.actions;
export default AuthSlice.reducer;
휴 인증처리 너무 어렵다 😥
갈 길이 먼데 벌써 수요일인 것도 놀랍..
내일도 힘내자 💪