해결된 질문
작성
·
398
·
수정됨
0
안녕하세요 강의 감사히 잘 듣고 있습니다.
다름이 아니라 chapter06에서 코드는 같은데
Notification의 componentDidUpdate() 한번씩 더 호출되는데 이유를 모르겠습니다.
import React from "react";
const styles = {
wrapper: {
margin: 8,
padding: 8,
display: "flex",
flexDirection: "row",
border: "1px solid grey",
borderRadius: 16,
},
messageText: {
color: "black",
fontSize: 16,
},
};
class Notification extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
console.log(`${this.props.id} componentDidMount() called.`);
}
componentDidUpdate() {
console.log(`${this.props.id} componentDidUpdate() called.`);
}
componentWillUnmount() {
console.log(`${this.props.id} componentWillUnmount() called.`);
}
render() {
return (
<div style={styles.wrapper}>
<span style={styles.messageText}>{this.props.message}</span>
</div>
);
}
}
export default Notification;
import React from "react";
import Notification from "./Notification";
const reservedNotifications = [
{
id: 1,
message: "안녕하세요, 오늘 일정을 알려드립니다.",
},
{
id: 2,
message: "점심식사 시간입니다.",
},
{
id: 3,
message: "이제 곧 미팅이 시작됩니다.",
},
];
var timer;
class NotificationList extends React.Component {
constructor(props) {
super(props);
this.state = {
notifications: [],
};
}
componentDidMount() {
const { notifications } = this.state;
timer = setInterval(() => {
if (notifications.length < reservedNotifications.length) {
const index = notifications.length;
notifications.push(reservedNotifications[index]);
this.setState({
notifications: notifications,
});
} else {
this.setState({
notifications: [],
});
clearInterval(timer);
}
}, 1000);
}
componentDidUpdate() {
console.log(` parent componentDidUpdate() called.`);
}
componentWillUnmount() {
if (timer) {
clearInterval(timer);
}
}
render() {
return (
<div>
{this.state.notifications.map((notification) => {
return (
<Notification
key={notification.id}
id={notification.id}
message={notification.message}
/>
);
})}
</div>
);
}
}
export default NotificationList;
추가로 NotificationList의 componentDidUpdate()가 계속 호출되는데 이유가 있을까요?
답변 2
0
안녕하세요, 소플입니다.
해당 부분은 AI가 답변해준 것처럼 StrictMode때문에 발생하는 것입니다.
아래 링크의 답변을 참고하시면 도움이 될 것입니다!
추가로 정확한 동작 확인을 위해서 componentWillUnmount()
에서도 로그를 출력해보세요~
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
sean k님의 질문은 React의 생명주기 메서드와 연관된 componentDidUpdate()
가 예상과 다르게 동작하는 상황에 대한 것으로 이해됩니다. sean k님처럼 React의 componentDidUpdate()
메서드가 원하는 방식으로 동작하지 않는 상황은 주로 컴포넌트의 state가 예상치 못한 시점에 변경되어 발생할 수 있습니다.
React 18에서 도입된 Strict Mode에서는 컴포넌트의 componentDidMount()
및 기타 생명주기 메서드들이 예상보다 더 자주 호출될 수 있습니다. 이 모드는 개발 중에만 활성화되며, 특정 부작용을 이중으로 체크하기 위해 도입되었습니다.
NotificationList
의 componentDidUpdate()
가 계속 호출되는 현상은, 컴포넌트의 state가 set될 때마다 발생합니다. sean k님의 코드에서는 setInterval
내에서 주기적으로 state를 업데이트 하고 있기 때문에, 이로 인해 componentDidUpdate()
가 반복해서 호출될 수 있습니다. 특히, setState
호출 후에는 컴포넌트가 리렌더링 되고, 이로 인해 componentDidUpdate()
가 실행됩니다.
sean k님의 경우엔, setInterval
을 통해 주기적으로 notifications
상태가 업데이트 되므로 componentDidUpdate()
가 호출됩니다. 만약, notifications
상태가 빈 배열로 초기화되는 것과 같은 상태 업데이트가 주기적으로 발생하게 될 때에도 마찬가지로 componentDidUpdate()
가 호출됩니다.
질문 내용과 유사한 상황에 올바른 대응 방법을 찾는 데 도움이 될 기존 답변을 찾아볼 때, 리액트 버전 18에서 Strict Mode의 동작 변경이나, 생명주기 메서드의 호출 패턴 변경에 대해 설명한 NotificationList.jsx 챕터 6장 실습 내용 질문 - 동시에 2개씩 나옴 답변을 참고하시면 도움이 될 수 있습니다. 이 답변에서는 여러번의 랜더링을 일으키는 Strict Mode의 동작에 대하여 소개하고 있습니다.
- [NotificationList.jsx 챕터 6장 실습 내용 질문 - 동시에 2개씩 나옴](https://www.inflearn.com/questions/619705)
이때, Strict Mode는 리액트 개발 모드에서만 활성화되어 있으며, 개발자가 잠재적인 문제를 찾을 수 있도록 도와주는 도구입니다. 프로덕션 빌드에서는 이러한 추가적인 호출이 발생하지 않습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.