javascript - 在 react.js 项目中运行 pixi.js 脚本

标签 javascript reactjs pixi.js

我试图在 React 项目中运行 pixi.js 脚本,但我被这个错误阻止了:

Cannot read property 'appendChild' of null

我不知道为什么会出现这个错误。我的脚本必须在 div 中创建一个 Canvas 元素以显示具有扭曲效果的图像:http://guillaumeduclos.fr/ripple-effect/它在基本的 HTML 和 JS 环境中运行良好。

Image of TypeError

我的代码:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import image from './image.png';
import * as PIXI from 'pixi.js'

var width = window.offsetWidth;
var height = window.offsetHeight;
var playground = document.getElementById('pxrender');  
var canvas;
var ratio = 150 / 830;
var count = 0;
var raf;

var renderer = PIXI.autoDetectRenderer(width, height,{transparent:true});
renderer.autoResize = true;
var tp, preview;
var displacementSprite,
    displacementFilter,
    stage;

class App extends Component {

  state = {
    playground: null
  }

  componentDidMount() {
    this.setState({playground: this.refs.pxrender});
  }

  setScene = (url) => {
    playground.appendChild(renderer.view);
    stage = new PIXI.Container();
    tp = PIXI.Texture.fromImage(url);
    preview = new PIXI.Sprite(tp);
    preview.anchor.x = 0;
    displacementSprite = PIXI.Sprite.fromImage('https://res.cloudinary.com/dvxikybyi/image/upload/v1486634113/2yYayZk_vqsyzx.png');
    displacementSprite.texture.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT;
    displacementFilter = new PIXI.filters.DisplacementFilter(displacementSprite);
    displacementSprite.scale.y = 0.6;
    displacementSprite.scale.x = 0.6;
    stage.addChild(displacementSprite);
    stage.addChild(preview);
    this.animate();
  }

  removeScene = () => {
    cancelAnimationFrame(raf);
    stage.removeChildren();
    stage.destroy(true);
    playground.removeChild(canvas);
  }

  animate = () => {
    raf = requestAnimationFrame(this.animate);
    displacementSprite.x = count*10;
    displacementSprite.y = count*10;
    count += 0.05;
    stage.filters = [displacementFilter];
    renderer.render(stage);
    canvas = playground.querySelector('canvas');
  }

  render() {

    this.setScene(image);

    return (
      <div ref="pxrender" id="pxrender">

      </div>
    );
  }
}

export default App;

感谢您的帮助。

最佳答案

您需要在 componentDidMount() 中启动您的 Pixi 应用程序,而不是 render()

this.setScene(image);移动到componentDidMount(),像这样:

componentDidMount() {
    this.setScene(image);
}

有关 React 中 pixi.js 场景的更完整示例,请查看此处:https://github.com/ccnmtl/astro-interactives/blob/master/sun-motion-simulator/src/DatePicker.jsx

关于javascript - 在 react.js 项目中运行 pixi.js 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50554598/

相关文章:

javascript - 机器学习模型中的无效元素类型

javascript - 建议使用 jquery 和 Html 填充动态创建的表单的测试自动化工具

javascript - 来自react-intl的FormattedNumber组件不起作用

reactjs - Bundler 不会自动加载(不存在 bundle URL 错误)

javascript - 将 axios 请求的响应推送到数组中

javascript - 将对象数组的所有值与对象进行比较

javascript - 使用 Ionic DateTime 分两步选择日期和时间

javascript - 用PIXI画线,用TweenMax移动

javascript - Pixi js 使用来自 Canvas 的纹理填充形状

javascript - 绘制一个没有线边框的空心圆