[소플의 처음 만난 리액트] 6장 실습문제
리액트 컴포넌트에서 state와 생명주기를 이용하여 알림 기능을 구현했습니다. NotificationList 컴포넌트에서는 state를 사용하여 알림 데이터를 관리하고, componentDidMount와 componentWillUnmount 함수를 이용하여 알림을 주기적으로 업데이트하고 제거합니다. 이를 통해 알림을 동적으로 표시하고 관리할 수 있습니다.
Dec 30, 2023
Notification.jsx
import React from "react";
// 실습: State와 생명주기 함수 사용하기
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 {
  // Notification 컴포넌트
  constructor(props) {
    super(props);
    this.state = {};   // 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;NotificationList.jsx
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에 변경점이 생기면 재렌더링을 한다.
      notifications: [], // 빈 배열을 상태에 넣음, 앞으로 사용할 데이터를 state에 넣어서 초기화.
    };
  }
  componentDidMount() {
    // 컴포넌트가 마운트 된 직후 실행할 내용
    const { notifications } = this.state;
    timer = setInterval(() => { // 매 1초마다 정해진 작업 수행
      //  미리 만들어둔 알림 데이터 배열 reservedNotification으로부터 데이터를 하나씩 가져와 state에 있는 nptification 배열에 업데이트.
      if (notifications.length < reservedNotifications.length) { // 배열의 길이가 reservedNotification과 같아질 때까지 반복
        const index = notifications.length; // index를 초기화
        notifications.push(reservedNotifications[index]); // 해당 인덱스의 문자열을 배열에 push.
        this.setState({
          Notifications: notifications, // state를 바꿈
        });
      } else {
        this.setState({
          notifications: [],  //unmaount 로고 보기 위해 notifications 배열을 비움
        });
        clearInterval(timer); //  배열의 길이가 같아졌다면 timer를 제거.
      }
    }, 1000);
  }
  componentWillUnmount() {
    if (timer) { // true로 취급 == Truthy
      clearInterval(timer); // unmount된 시점에서도 사라지지 않았다면 타이머가 돌아가지 않게 clear 시킨다.
    }
  }
  render() {
    return (
      <div>
        {this.state.notifications.map((notification) => {
          return (
            <Notification
              key={notification.id}
              id={notification.id}
              message={notification.message}
            />
          );
        })}
      </div>
    );
  }
}
export default NotificationList;핵심 키워드
- state는 컴포넌트의 상태를 변경 가능한 데이터다. 직접적인 변경은 불가능하고 setState() 와 같은 함수를 통해 간접적으로 변경을 해야한다.
- state가 변경될 경우 컴포넌트가 재렌더링 되므로 렌더링과 데이터 흐름에 사용되는 값만 state에 포함시켜야 한다.
- 컴포넌트는 계속 존재하는 것이 아니라 시간의 흐름에 따라 생성되고 업데이트되다가 소멸된다. 컴포넌트가 생성되는 시점을 마운트, 컴포넌트의 props가 변경되는 시점을 업데이트, 컴포넌트를 더 이상 화면에 표시하지 않는 시점을 언마운트라고 한다.
결론!
리액트 컴포넌트에서 state와 생명주기를 이용한 구현이 중요하다는 것을 알 수 있었다.
Share article