javascript - 使用 React 更新包含 Canvas 的组件

标签 javascript reactjs html5-canvas

所以我试图修改包含 Canvas 元素的组件的状态。 Canvas 本身不应该更新,因为受影响的状态不会影响 Canvas 的渲染?

import React from 'react';

export default class App extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            isPlaying: false
        }
    }

    handleClick() {
        this.setState({isPlaying: true});
    }

    componentDidMount() {
        this.ctx.fillRect(50,50, 100, 100);
    }

    render() {
        return(
            <div id='container'>
                <canvas width={900} height={500}
                    ref={r => this.ctx = r.getContext('2d')}
                    onClick={() => this.handleClick()} />
            </div>
        );
    }
}

然而,当我触发 Canvas 的 onClick 事件时会出现错误:
Uncaught TypeError: Cannot read property 'getContext' of null
at ref (App.js:52)

最佳答案

React 组件将在其任何状态属性更改时重新呈现自身。如果您想控制此行为,请考虑覆盖 shouldComponentUpdate方法。如果您返回 false从此方法适用于任何 state条件,您的组件将不会为该条件重新渲染。

现在,关于错误,你应该移动 ref 的箭头函数定义成函数引用。

原因是,箭头函数在重新渲染时总是作为新实例传递,而函数引用在第一次渲染时只会传递一次。

阅读更多来自 here更详细地了解这一点。

您的实现应如下所示:

import React from "react";

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isPlaying: false
    };
    this.setContext = this.setContext.bind(this);
  }

  setContext(r) {
    console.log(r);
    this.ctx = r.getContext("2d");
  }

  handleClick(e) {
    this.setState({ isPlaying: true });

  }

  componentDidMount() {
    this.ctx.fillRect(50, 50, 100, 100);
  }

  render() {
    return (
      <div id="container">
        <canvas
          width={900}
          height={500}
          ref={this.setContext}
          onClick={() => this.handleClick()} />
        />
      </div>
    );
  }
}

关于javascript - 使用 React 更新包含 Canvas 的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47738897/

相关文章:

javascript - 使用函数通过 $routeProvider 定义 Controller

css - 调整窗口大小时如何在 React 中缩小表格中不断增长的图表

reactjs - 推断消费端组件中第三方组件的forwardref类型

javascript - position.set 如何使 Canvas 图像居中?

javascript - Fabric js如何模拟鼠标按下事件

javascript - HTML大图性能问题

javascript - AngularJS ng-repeat 和表单验证

javascript - 使用纯 Javascript 从自定义数据属性获取值,而不使用 getElementById

reactjs - 如何在声明上创建状态数组 react Hook

javascript - 圆圈、 Canvas 和数学,天哪