Действительно ли React unmount удаляет элементы?

#javascript #reactjs #typescript

#javascript #reactjs #typescript

Вопрос:

Я создал компонент, который отображает только пустой элемент canvas. После инициализации в use effect я рисую небольшой квадрат, а затем запускаю интервал, чтобы перерисовать квадрат в разных местах. Первоначально я сделал это без использования state и просто сохранил значение в локальной переменной, квадрат был перерисован, как и ожидалось, и компонент не был повторно размонтирован и отрисован.

Затем я попытался перевести переменную в состояние, чтобы посмотреть, будет ли холст очищен / удален при размонтировании и воссоздан свежим и чистым при рендеринге, но это не так. Компонент постоянно размонтируется и повторно отображается, но, похоже, он всегда отображает содержимое старого холста.

Работает ли этот виртуальный DOM? Кажется, я ничего не могу найти по этому поводу, поскольку в большинстве статей о React Render просто говорится: «Функция рендеринга вставляет HTML в DOM».

 import React, { FunctionComponent, useEffect, useState } from 'react';

interface Babylon_props { }

export const Babylon: FunctionComponent<Babylon_props> = (props) =>
{
    let canvas: HTMLCanvasElement;
    let ctx: CanvasRenderingContext2D;
    let interval: number;
    //let x = 0;

    let tick = () => 
    {
        ctx.fillRect(x, x, 20, 20);
        setX(x   10);
        //x  = 10;
    }

    const [x, setX] = useState(0);

    useEffect(() => 
    {
        console.log("Creating Babylon component...");

        canvas = document.getElementById("BblCanvas") as HTMLCanvasElement;
        ctx = canvas.getContext("2d");
        ctx.fillStyle = "#FF0000";
        ctx.fillRect(0, 0, 10, 10);

        interval = setInterval(tick, 1000);

        return () =>
        {
            console.log("Destroying Babylon component...");
            clearInterval(interval);
        };

    }, [x]);

    return (
        <canvas id="BblCanvas" width="800" height="600"></canvas>
    )
}
 

Комментарии:

1. Is this virtual DOM at work? ДА. Ваш DOM не меняется, поэтому нет необходимости создавать новые элементы.

2. @tkausl Спасибо, я думаю, мне нужно больше почитать о виртуальном DOM. Не то, чтобы я делал что-то подобное, не кажется особенно эффективным проходить весь процесс рендеринга React для обновления холста.