일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- react
- Project Bee
- 오블완
- 창의충전소
- 백준 1992
- Navigation
- 자료구조
- 상속 관계 매핑
- 비트마스킹
- service 테스트
- 노마드코더
- 구현
- 버튼 활성화
- bfs dfs
- 이영직
- React Native
- ReactNative
- 완전탐색
- web view
- 폴더구조
- BFS
- 휴대폰 기기
- multipart upload
- 경우의 수
- springboot
- 티스토리챌린지
- React Natvive
- 원복
- FlatList
- 해외 대외활동
- Today
- Total
유미의 기록들
[React Native -10] Navigation LifeCycle 본문
상품등록screen → 갤러리screen → 카메라screen으로 push했을 때는 componentDidMount()가 실행이 되었다
하지만, 카메라screen → 상품등록screen으로 goBack했을 때 카메라screen에서 받아온 데이터를 상품등록screen의 state에 넣어줄 것을 예상했지만 constructor, componentDidMount()가 아예 실행이 되지 않았다 즉, 재렌더링이 이루어지지 않고 있다는 느낌을 받았다
리액트 네이게이션 공식문서를 보면 네이게이션 라이프 사이클이라는 것이 있었다
https://reactnavigation.org/docs/navigation-lifecycle
스택네이게이션에서는 스크린이 스택 형태로 쌓이며 이동을 하는데, 이전에 Mounting된 상태이면 componentDidMount가 실행되지 않는다고 이해했다
react-navigation은 3가지 방법을 제공한다
1. 'focus' event with an event listener.
2. useFocusEffect hook
3. useIsFocused hook
우리 프로젝트는 class component형으로 진행하기 때문에 hook을 사용할 수 없으므로 컴포넌트 생명주기를 봐야겠다고 생각했다
크게 4가지로 분류할 수 있다
Mount : 컴포넌트 처음 실행시켰을 때의 상태
state,props,context 저장 → componentWillMount() → render() → componentDidMount() (주로 서버에 데이터 요청)
Update -props : Props가 업데이트 될 때
componentWillRecieveProps() (props가 변경될 때 감지) → shouldComponentUpdate() ( component 업데이트 할 꺼야?)
→ componentWillUpdate() (component가 업데이트 될 때) → render() → compoentDidUpdate() (component 가 업데이트 된 후)
Update -state : State가 업데이트 될 때
*Props와 차이점은 componentWillRecieveProps을 호출하지 않는다
메소드들이 바뀔 state에 대한 정보를 갖고 있고 componentDidUpdate는 바뀌기 전의 state를 갖고 있음
shouldComponentUpdate() → componentWillUpdate() → render() → compoentDidUpdate()
Unmount : 컴포넌트 제거 될때
Error : 에러가 발생했을 때
서버 통신에 실패 했을 때 에러페이지 만들 때 사용
내가 적용해야 할 것은 다른 스크린에서 받아온 Props값을 이전스크린에서 setState해주어야 하기때문에 componentDidUpdate() 를 사용해야겠다고 생각했다
❗ 주의해야 할 점은 componentDidUpdate()에서 setState()를 호출할 수 있지만, 조건문으로 감싸지 않으면 무한 반복이 발생할 수 있다는 것이다.
componentDidUpdate(prevProps,prevState){
console.log("prevState값: ",prevProps);
console.log("prevProps값: ",prevState);
}
따라서 나는 카메라screen 에서 넘어받은 imageURLs을 상품등록screen 에서 setState해줘야하기 때문에 라우트 파라미터 값과 비교해서 setState해주었다
componentDidUpdate(prevProps){
if(prevProps.route.params.imageURLs !=this.props.route.params.imageURLs){
this.setState({imageURLs: this.props.route.params.imageURLs});
}
}
//이미지 삭제 버튼
imageRemove = (index) => {
console.log(index);
this.setState({
imageURLs: this.state.imageURLs.filter((value, indexNum) => indexNum !== index)
});
console.log('삭제완료');
};
삭제할 때 filter를 이용하여 state에 있는 imageURLs값을 변경해주었다
❗ 카메라screen, 갤러리screen에서 각각 받아온 imageURLs값을 함께 보여주어야 하기 때문에 concat을 사용해서 this.state.imageURLs에 쌓이도록 하였다
componentDidUpdate(prevProps,prevState){
if(prevProps.route.params.imageURLs !=this.props.route.params.imageURLs){
this.setState({imageURLs: this.state.imageURLs.concat(this.props.route.params.imageURLs)});
}
}
정말 많은 삽질 끝에 구현을 했다... 무조건 구글링한다는 마인드가 아니라 어떻게 구조를 잡을 것인지에 대한 생각을 통한 코딩을 해야 한다는 것을 뼈저리게 느꼈다 😊
[결과물]
'MDLAB 기록 > 차량부품거래애플리케이션' 카테고리의 다른 글
[React Native -12] 사진 개수 제한 (0) | 2022.11.24 |
---|---|
[React Native -11] Drawer Navigation (0) | 2022.11.23 |
[React Native -9] FlatList (0) | 2022.11.03 |
[React Native -8] VisionCamera 구현 (0) | 2022.11.03 |
[React Native -7] Picker 구현 (0) | 2022.10.31 |