Implementing and verifying the integrity of the cleanup function on the core useEffect

This commit is contained in:
Rezmason
2025-05-15 01:36:28 -07:00
parent 22241924c9
commit b7085c5bf7
2 changed files with 31 additions and 17 deletions

View File

@@ -120,16 +120,9 @@ export const Matrix = memo((props) => {
); );
}; };
useEffect(() => { const cleanup = () => {
const useWebGPU = supportsWebGPU() && ["webgpu"].includes(rest.renderer?.toLowerCase());
const isWebGPU = rRenderer?.type === "webgpu";
if (rRenderer != null && useWebGPU === isWebGPU) {
return;
}
if (rCanvas != null) { if (rCanvas != null) {
matrix.current.removeChild(rCanvas); rCanvas.remove();
setCanvas(null); setCanvas(null);
} }
@@ -141,6 +134,17 @@ export const Matrix = memo((props) => {
if (rRenderer != null) { if (rRenderer != null) {
setRenderer(null); setRenderer(null);
} }
};
useEffect(() => {
const useWebGPU = supportsWebGPU() && ["webgpu"].includes(rest.renderer?.toLowerCase());
const isWebGPU = rRenderer?.type === "webgpu";
if (rRenderer != null && useWebGPU === isWebGPU) {
return;
}
cleanup();
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
canvas.style.width = "100%"; canvas.style.width = "100%";
@@ -155,6 +159,8 @@ export const Matrix = memo((props) => {
setRain(rain); setRain(rain);
}; };
loadRain(); loadRain();
return cleanup;
}, [props.renderer]); }, [props.renderer]);
useEffect(() => { useEffect(() => {

View File

@@ -1,4 +1,5 @@
import React from "react"; import React, { useState } from "react";
import { unmountComponentAtNode } from "react-dom";
import { createRoot } from "react-dom/client"; import { createRoot } from "react-dom/client";
import { Matrix } from "./Matrix"; import { Matrix } from "./Matrix";
@@ -23,6 +24,7 @@ const App = () => {
const [version, setVersion] = React.useState(versions[0]); const [version, setVersion] = React.useState(versions[0]);
const [numColumns, setNumColumns] = React.useState(10); const [numColumns, setNumColumns] = React.useState(10);
const [rendererType, setRendererType] = React.useState(null); const [rendererType, setRendererType] = React.useState(null);
const [destroyed, setDestroyed] = useState(false);
const onButtonClick = () => { const onButtonClick = () => {
setVersion((s) => { setVersion((s) => {
const newVersion = versions[idx]; const newVersion = versions[idx];
@@ -39,19 +41,25 @@ const App = () => {
const onRendererButtonClick = () => { const onRendererButtonClick = () => {
setRendererType(() => (rendererType === "webgpu" ? "regl" : "webgpu")); setRendererType(() => (rendererType === "webgpu" ? "regl" : "webgpu"));
}; };
const onDestroyButtonClick = () => {
setDestroyed(true);
};
return ( return (
<div> <div>
<h1>Rain</h1> <h1>Rain</h1>
<button onClick={onButtonClick}>Change properties</button> <button onClick={onButtonClick}>Change properties</button>
<button onClick={onRendererButtonClick}>Renderer: {rendererType ?? "default (regl)"}</button> <button onClick={onRendererButtonClick}>Renderer: {rendererType ?? "default (regl)"}</button>
<Matrix <button onClick={onDestroyButtonClick}>Destroy</button>
style={{ width: "80vw", height: "45vh" }} {!destroyed && (
version={version} <Matrix
numColumns={numColumns} style={{ width: "80vw", height: "45vh" }}
renderer={rendererType} version={version}
density={2.0} numColumns={numColumns}
/> renderer={rendererType}
density={2.0}
/>
)}
</div> </div>
); );
}; };