I'm trying to create a React app with a single p5.js sketch. However, the component containing the p5 sketch is being duplicated on my page. Not sure why it would be rendered this way.
Here you can see the code: https://stackblitz.com/edit/react-ts-kocwqw?file=App.tsx,Sketch.tsx,index.tsx
Here are the react components definition:
App.tsx
import React = require('react');
import Sketch from './Sketch';
function App() {
return (
<div className="App">
<Sketch />
</div>
);
}
export default App;
Sketch.tsx
import React = require('react');
import { useEffect } from 'react';
import p5 from 'p5';
const Sketch = () => {
const p = (p5: any) => {
let radius: number;
p5.setup = () => {
p5.createCanvas(p5.windowWidth / 2, p5.windowHeight / 2);
p5.background(0);
radius = 0;
};
p5.draw = () => {
p5.ellipse(p5.width / 2, p5.height / 2, radius, radius);
if (radius < 70) radius++;
};
};
useEffect(() => {
new p5(p);
}, []);
return <></>;
};
export default Sketch;
index.tsx
import * as React from 'react';
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
const rootElement = document.getElementById('root');
const root = createRoot(rootElement);
root.render(
<StrictMode>
<App />
</StrictMode>
);
What could I be missing here?
p
function is ran twice. You should return a cleanup function in youruseEffect
call to remove the created canvas somehow. – Besot