我真的很喜欢 p5.js 和 react.js,所以我想知道如何将这两者结合在一起,但我无法做到,所以我需要你的帮助。我无法真正为您提供一些代码示例,因为我不知道如何开始。
所以我想做的是: 1. create-react-app 2.render a canvas using p5.js (我不需要 p5.dom 和 p5.sound)
我真的很喜欢 p5.js 和 react.js,所以我想知道如何将这两者结合在一起,但我无法做到,所以我需要你的帮助。我无法真正为您提供一些代码示例,因为我不知道如何开始。
所以我想做的是: 1. create-react-app 2.render a canvas using p5.js (我不需要 p5.dom 和 p5.sound)
需要做的第一件事是安装create-react-app工具。一旦它启动并运行 p5.js, 就可以包含react-p5-wrapper包;假设正在使用像npm这样的包管理器,这可以通过执行npm install p5 react-p5-wrapper
任何认为必要的标志来完成。
react-p5-wrapper 是一个包装器组件,它接收对草图的引用(实例模式),并使用一些 react 组件“生命周期方法”来相应地操作它,主要是通过执行myCustomRedrawAccordingToNewPropsHandler(props)
需要在所述草图。
要试一试并查看它的运行情况,可以像这样修改App.js文件的内容:
import React, { Component } from 'react';
import P5Wrapper from 'react-p5-wrapper';
import sketch from './sketches/sketch';
import './App.css';
class App extends Component {
constructor(){
super();
this.state = {color:[Math.random()*255, Math.random()*255, Math.random()*255]};
this.randomColor = this.randomColor.bind(this);
}
randomColor(){
this.setState({color:[Math.random()*255, Math.random()*255, Math.random()*255]}
)
}
render() {
return (
<div>
<button onClick={this.randomColor}>Random Color</button>
<P5Wrapper sketch={sketch} color={this.state.color}></P5Wrapper>
</div>
);
}
}
export default App;
当sketch
从进口sketch.js它位于另一个文件夹,在这种情况下,所谓的草图:
export default function sketch(p){
let canvas;
p.setup = () => {
canvas = p.createCanvas(300, 200);
p.noStroke();
}
p.draw = () => {
p.background('orangered');
p.ellipse(150, 100, 100, 100);
}
p.myCustomRedrawAccordingToNewPropsHandler = (newProps) => {
if(canvas) //Make sure the canvas has been created
p.fill(newProps.color);
}
}
如果一切正常,屏幕上应该有一个按钮和一个草图,每次按下按钮时,草图中的圆圈都会随机改变颜色。
应该注意的是,该myCustomRedrawAccordingToNewPropsHandler
函数在包装器的componentDidMount
和componentWillReceiveProps
“生命周期方法”中被调用,后者目前被归类为不安全的。
react-p5
该组件可让您将 p5 Sketches 集成到您的 React 应用程序中。 演示, 文档
安装
npm i react-p5
用法
import React, { Component } from "react";
import Sketch from "react-p5";
export default class App extends Component {
x = 50
y = 50
setup = (p5, parent) => {
p5.createCanvas(500, 500).parent(parent)
}
draw = p5 => {
p5.background(0)
p5.ellipse(this.x, this.y, 70, 70)
this.x++
}
render() {
return <Sketch setup={this.setup} draw={this.draw} />
}
}