Управление ресурсами

Последнее обновление: 01.04.2022

В приложениях React при удалении компонентов важно освобождать ресурсы, которые используются этими компонентами. Для управления ресурсами можно задействовать функции жизненного цикла компонента.

Создание подобных ресурсов в компонентах React производится в функции componentDidMount(). А для освобождения ресурсов применяется функция componentWillUnmount().

Стандартный пример - часы, которые выводят текущее время на страницу и для обновления времени используют таймер:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
    <div id="app"></div>
    <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">
        const root = ReactDOM.createRoot(
            document.getElementById("app")
        );
        class Clock extends React.Component {
            constructor(props) {
              super(props);
              this.state = {date: new Date(), name: "Tom"};
              this.unmount = this.unmount.bind(this);
            }
            unmount(){
                root.unmount();
            }
            componentDidMount() {
              this.timerId = setInterval(
                ()=> this.tick(),
                1000
              );
              console.log("componentDidMount()");
            }
     
            componentWillUnmount() {
              clearInterval(this.timerId);
              console.log("componentWillUnmount()");
            }
     
            tick() {
              this.setState({
                date: new Date()
              });
            }
     
            render() {
              return (
                <div>
                  <h1>Привет, {this.state.name}</h1>
                  <h2>Текущее время {this.state.date.toLocaleTimeString()}.</h2>
                  <button onClick={this.unmount}>Unmount</button>
                </div>
              );
            }
          }
        
        root.render(
           <Clock />
       );
    </script>
</body>
</html>

В функции componentDidMount() создается таймер - ресурс, используемый компонентом. Для его освобождения в функции componentWillUnmount() вызывается функция clearInterval().

Для имитации удаления компонента с веб-страницы (и соответственно для вызова метода componentWillUnmount и удаления ресурсов) определена кнопка, по нажатию на которую вызывается функция unmount(). В этой функции вызывается функция root.unmount(), которая открепляет компонент от html-элемента на веб-странице.

Жизненный цикл компонента в React

В итоге работа компонента будет выглядеть следующим образом:

  1. Когда элемент <Clock /> передается в функцию root.render(), React вызывает конструктор компонента Clock. В конструкторе компонента устанавливается объект this.state, который содержит текущую дату и время.

  2. Затем React вызывает метод render() компонента Clock, и происходит обновление DOM, в который добавляется элемент, созданный компонентом Clock.

  3. Когда элемент, сгенерированный компонентом Clock, добавляется в DOM, React вызывает метод componentDidMount(). Это приводит к запуску метода tick()

  4. Каждую секунду браузер вызывает метод tick(), в котором через вызов setState() обновляется значение this.state.date. При обновлении this.state React вызывает повторно метод render() и обновляет веб-страницу.

  5. Если нажимем на кнопку, компонент Clock удаляется из DOM, и React вызывает метод componentWillUnmount(), в котором останавливается таймер.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850