2023.03.03.(금)
TIL Today I Learned
해당 깃허브
Good: 오늘은 마이페이지 리코일을 했다. 만족한다.
Bad: 리코일하는데 하루가 꼬박 걸린 점이 문제이다.
//Layoput 프로필 수정 모달 창 추가
<>
{editProfileModal ? (
<CustomModal
modal={editProfileModal}
setModal={setEditProfileModal}
width="524"
height="695"
element={
<ModalProfile
/>
}
/>
) : null}
</>
Layoput.tsx는 전역에서 사용할 수 있는 곳이다. 여기 적은 editProfileModal은 Profile.tsx and ModalProfile.tsx에서 손 쉽게 사용할 수 있었다.
// Profile.tsx 수정 전
const [editProfileModal, setEditProfileModal] = useState(false);
const [imgEdit, setImgEdit] = useState<string>(profileimg);
const [nicknameEdit, setNicknameEdit] = useState<string>(
authService?.currentUser?.displayName as string);
// 프로필 수정 모달 창 버튼
const editProfileModalButton = () => {
setEditProfileModal(!editProfileModal);
};
return(
{/* 프로필 수정 버튼 props */}
{editProfileModal && (
<ModalProfile
profileEditCancle={profileEditCancle} //프로필 수정 취소
editProfileModal={editProfileModalButton} //프로필 수정 버튼
imgEdit={imgEdit} //기본 아이콘 사진
setImgEdit={setImgEdit} //기본 아이콘 사진 set
nicknameEdit={nicknameEdit} //닉네임 변경
/>
)}
<ProfileEdit>
{/* 사진 */}
<div>
<ProfileImage img={imgEdit}></ProfileImage>
{/* 프로필 수정 */}
<ProfileEditBtn onClick={editProfileModalButton}>
내 정보 변경 {'>'}
</ProfileEditBtn>
</div>
)
// Profile.tsx 수정 후
import { useRecoilState } from 'recoil';
import { editProfileModalAtom } from '@/atom';
const [editProfileModal, setEditProfileModal] =
useRecoilState(editProfileModalAtom);
// 프로필 수정 모달 창 버튼
const editProfileModalButton = () => {
setEditProfileModal(!editProfileModal);
};
return(
<ProfileEditBtn onClick={editProfileModalButton}>
내 정보 변경 {'>'}
</ProfileEditBtn>
)
프로필 수정 취소, 프로필 수정 버튼, 기본 아이콘 사진, 기본 아이콘 사진 set, 닉네임 변경을 아예 다 뺐다. 이유는 프로필 수정 취소와 닉네임 변경은 모달 창에서 필요한 것이기 때문에 ModalProfile.tsx에 넣었다. 프로필 수정 버튼은 Profile.tsx 에서만 사용하기 때문에 밑에 남겼다. 기본 아이콘 사진은Profile.tsx and ModalProfile.tsx 두 개에서만 이용을 하고 있기 때문에 각각 넣었다.
//ModalProfile.tsx 수정 전
interface Props {
profileEditCancle: () => void;
editProfileModal: () => void;
imgEdit: string;
setImgEdit: Dispatch<SetStateAction<string>>;
nicknameEdit: string;
} //props를 하지 않아 후에 삭제한 부분
function editProfileModal() {
props.editProfileModal();
}
// 프로필 사진 삭제
const deleteImgFile = async () => {
await updateProfile(authService?.currentUser!, {
displayName: props.nicknameEdit,
photoURL: '',
});
props.setImgEdit(imgFile as string);
};
//ModalProfile.tsx 수정 후
import { useRecoilState } from 'recoil';
import { editProfileModalAtom } from '@/atom';
const imgFile = '/profileicon.svg';
const [editProfileModal, setEditProfileModal] =
useRecoilState(editProfileModalAtom); //전역에서 사용 중
const [nicknameEdit, setNicknameEdit] = useState<string>(
authService?.currentUser?.displayName as string
); //Profile.tsx에서 가져옴
const profileimg = authService?.currentUser?.photoURL ?? imgFile; //Profile.tsx에서 똑같이 사용함.
const [imgEdit, setImgEdit] = useState<string>(profileimg); //Profile.tsx에서 삭제 후 가져옴.
// 프로필 사진 삭제
const deleteImgFile = async () => {
await updateProfile(authService?.currentUser!, {
displayName: nicknameEdit, //props 제거함.
photoURL: '',
});
props.setImgEdit(imgFile as string);
};
// 사진만, 닉네임만, 비밀번호만 단독으로 고치는 것, 다 같이 고치는 것
if (nicknameToggle && !pwToggle) {
await updateProfile(authService?.currentUser!, {
displayName: data.nickname,
photoURL: downloadUrl ?? '',
})
.then((res) => {
customAlert('프로필 수정 완료하였습니다!');
setEditProfileModal(!editProfileModal);
})
.catch((error) => {
console.log(error);
});
}
...
} else if (!nicknameToggle && !pwToggle) {
await updateProfile(authService?.currentUser!, {
photoURL: downloadUrl ?? '',
})
.then((res) => {
customAlert('프로필 수정 완료하였습니다!');
setEditProfileModal(!editProfileModal);
})
.catch((error) => {
console.log(error);
});
return(
// 배경화면 누르면 취소
<ModalStyled
onClick={() => {
setEditProfileModal(!editProfileModal);
}}
>
)
Profile.tsx에서 props 해주던 것을 전부 삭제하였다. 그래서 ModalProfile.tsx로 전달해주던
props.editProfileModal
props.nicknameEdit
을 삭제하고 단독으로 사용하였다.
배경화면 누르면 취소하는 것은setEditProfileModal(!editProfileModal)
간단히 사용할 수 있어서 좋다.
Recoil은 React 애플리케이션에서 상태(state) 관리를 위한 라이브러리 중 하나이다. 기존에는 Redux와 MobX 등의 라이브러리가 사용되었지만, 최근에는 Recoil과 같은 새로운 라이브러리들이 등장하면서 선택의 폭이 넓어졌다. Recoil을 사용하는 이유는 다음과 같다.
- 간편한 구현과 사용
Recoil은 컴포넌트 간의 상태 전달과 업데이트를 간단하게 구현할 수 있다. Redux와 같은 라이브러리는 상태 업데이트를 위한 별도의 코드와 디렉토리 구조를 만들어야 하지만, Recoil은 React의 hook API를 사용하므로 상태 업데이트를 직관적으로 처리할 수 있다.
- 성능 최적화
Recoil은 React의 내장 기능인 React.memo()와 함께 사용하면 더욱 효율적인 렌더링을 할 수 있다. 이는 상태가 변경되지 않은 경우, 컴포넌트를 다시 렌더링하지 않고 이전에 렌더링된 결과를 재사용하는 것이다.
- 상태의 중앙 집중화
Recoil은 상태 관리를 위한 하나의 중앙 저장소를 사용한다. 이를 통해 상태의 중앙 집중화를 할 수 있으며, 여러 컴포넌트 간에 공유해야 하는 상태를 쉽게 관리할 수 있다. 이러한 구조는 코드의 가독성과 유지보수성을 높이는데 도움을 준다.
- 비동기 상태 처리
Recoil은 비동기 상태를 처리하는데도 유용하다. 예를 들어, Promise나 async/await를 사용하여 비동기 데이터를 가져올 때, Recoil의 selector 함수를 사용하면 비동기 데이터를 쉽게 관리할 수 있다.
따라서, Recoil을 사용하면 간편한 구현과 사용, 성능 최적화, 상태의 중앙 집중화, 비동기 상태 처리 등의 이점을 누릴 수 있다.
✔ 월: 최종 프로젝트
✔ 화: 최종 프로젝트
✔ 수: 최종 프로젝트
✔ 목: 최종 프로젝트
✔ 금: 최종 프로젝트
✔ 마이페이지 모달 창 리코일
□ 모바일에서 볼 수 있게 반응형으로 만들기