티스토리 뷰
프로젝트 진행 중...
스크랩 기능을 만들어야 했다.
어제 성공한 스크랩 기능은
얼핏 봐서는 완벽해보이지만... 팝업 창을 껐다 켜면 상태 유지 안됨...ㅎㅎㅎㅎㅎㅎ
어쩌지? 하다가 생각해낸 방법.
부모 컴포넌트에서 자식 컴포넌트를 관리하자!
컴포넌트 구조는 다음과 같다.
Mentoring.js (부모 컴포넌트)
MentorApply.js (자식 컴포넌트)
부모 컴포넌트
1. 북마크 상태를 관리할 boolean 타입 변수를 하나 만든다.
2. 변수의 상태를 바꿔줄 set 함수를 같이 설정한다. => 자연스럽게 useState를 쓰게 되겠죠?
3. 클릭했을 때 bmk의 상태를 바꾸기 위해 클릭 이벤트 함수도 만들어주자.
이제 이 bmk 값과 클릭 이벤트 함수를 자식에게 props로 전달해주면 된다.
togglePopup은 팝업창 열기/닫기를 위한 함수,
geul, current는 상세 글 조회를 위한 부분이라 넘어가고,
onClickBmk와 bmk 주목!
Mentoring.js 코드
const [bmk, setBmk] = useState(false);
const onClickBmk = () => {
setBmk(current => !current);
};
{ showPopup && <MentorApply togglePopup={togglePopup} geul={geul} current={current} onClickBmk={onClickBmk} bmk={bmk} />}
이제 자식 컴포넌트를 볼 차례!
나는 북마크 상태 변경 + 서버에 데이터 전송 / 삭제 요청을 한번에 해야 해서 클릭 이벤트가 2개 필요한 상황이었다..
그런데 onClick을 두번 쓸 수는 없으니...
PlusBMK => 스크랩 DB에 추가 요청하는 함수
DeleteBMK => 스크랩 DB에서 삭제 요청하는 함수
이 함수들 안에 onClickBmk()를 넣어주었다.
axios 라이브러리를 사용하여 통신했고,
추가할 땐 post, 삭제할 때는 delete를 사용했다.
MentorApply.js
function MentoApply({ togglePopup, current, bmk, onClickBmk}) {
...
const PlusBMK = async (e) => {
try {
const response = await axios.post('url', {
m_no: m_no
})
if(response.data.result === "SUCCESS"){
onClickBmk();
alert('스크랩 되었습니다.');
e.preventDefault();
}
}
catch (err) {
console.log("Bookmark plus error: ",err);
}
}
const DeleteBMK = async (e) => {
try {
const response = await axios.delete('url');
if(response.data.result === "SUCCESS"){
onClickBmk();
alert('스크랩이 취소되었습니다.');
e.preventDefault();
}
}
catch (err) {
console.log("Bookmark delete rror: ",err);
}
}
...
return (
<div>
...
{ bmk ? <BsBookmarkStarFill size="30" className={styles.book} onClick={DeleteBMK} /> : <BsBookmarkStar size="30" className={styles.book} onClick={PlusBMK} /> }
</div>
)
}
export default MentorApply;
부모 값을 전달하여 쓰면
팝업창을 껐다가 켜도 상태가 유지된다. ^_^
실행 영상
끝! 나같이 삽질하는 사람이 없길 바라며..^^
도움이 되셨다면 좋아요 한번만 눌러주세요...!ㅎㅎ
'React > Javascript' 카테고리의 다른 글
React에서 state를 사용하는 이유?, useState() 사용법 (0) | 2022.12.15 |
---|---|
React) 프로젝트 github-pages로 배포하기 & 오류 정리! (0) | 2022.12.07 |
React) Weather API를 활용하여 날씨 확인 사이트 만들기 (0) | 2022.09.07 |
ReactJS로 영화 웹사이트 만들기 #7 Coin Tracker (0) | 2022.01.27 |
ReactJS로 영화 웹사이트 만들기 #7 To Do List (0) | 2022.01.27 |
- Total
- Today
- Yesterday
- 리액트커스텀훅
- 자바스크립트최단거리
- 자바스크립트프로그래머스
- 웹디자인툴
- 개인플젝
- Graphql서버연결
- 리액트스크롤
- 리액트독학
- 리액트버튼누르면스크롤이동
- 숫자표현JS
- 자바스크립트미니프로젝트
- 가까운수js
- 무료목업레퍼런스사이트
- 자바스크립트기초
- 프로세스스레드차이
- 리액트스크롤이벤트
- JS비동기
- 토이프로젝트디자인
- 리액트
- ReactAnimation
- 프로그래머스
- 리액트스크롤애니메이션
- graphql개념
- graphql
- 스크롤내리면나타나는애니메이션
- 프로세스
- CSS디자인
- 프로그래머스js
- 자바스크립트문법
- 리액트state
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |