mirror of
https://github.com/Rezmason/matrix.git
synced 2026-04-21 15:29:30 -07:00
Implementing and verifying the integrity of the cleanup function on the core useEffect
This commit is contained in:
24
js/Matrix.js
24
js/Matrix.js
@@ -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(() => {
|
||||||
|
|||||||
24
js/index.js
24
js/index.js
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user