skip to content

solidjs p5 example

/ 1 min read

import { Component, createSignal, onCleanup, onMount } from 'solid-js';
import p5 from 'p5';

export interface Sketch {
  (instance: p5): void;
}

const createCanvas = (sketch: Sketch, container: HTMLDivElement): p5 => {
  return new p5(sketch, container);
};

const SolidP5Wrapper: Component<{
  sketch: Sketch;
}> = (props) => {
  let refelement: HTMLDivElement | undefined;
  let canvas: p5 | undefined;

  const [p5instance, setp5Instance] = createSignal < p5 > ();

  onMount(() => {
    console.log('onmount');
    if (!refelement) return;
    p5instance()?.remove();
    canvas = createCanvas(props.sketch, refelement);
    setp5Instance(canvas);
  });

  onCleanup(() => {
    p5instance()?.remove();
  });

  return <div ref={refelement}> Inner Element </div>;
};

const sketch = (p: p5) => {
  p.setup = () => {
    p.createCanvas(400, 400);
    p.frameRate(1);
  };

  p.draw = () => {
    console.log('draw');
    p.background(220);
    p.circle(200, 200, 100);
  };
};

const Network = () => {
  return (
    <>
      <SolidP5Wrapper sketch={sketch} />
      <h1>Hello </h1>
    </>
  );
};

export default Network;