无法使用 refs 从 render() 方法获取 HTML 元素
2020-10-22
327
我正在尝试使用 ReactJS 创建图形编辑器。我有
Workspace
组件。此组件使用画布绘制对象。
Workspace
组件是 React 类组件。
我无法获取
render()
方法中的 HTML 元素。
我无法使用
document.getElementById(..)
,我决定使用
React Refs
。这更像是干净的。
我遇到了这样的错误:
TypeError: Cannot read property 'getContext' of null
import React, { Component } from 'react';
import './Workspace.css';
// Workspace component is resposiable for drawing defferent elements on the screen
// It uses canvas API to draw elements and the stuff like that
export default class Workspace extends Component {
constructor(props) {
// Calling parent`s constructor function
super(props);
// All objects that will be drawn
this.objects = [];
// Creating the `canvasRef` ref for having access to the canvas element
this.canvasRef = React.createRef();
// Getting the canvas element, using the`canvasRef` ref
const canvas = this.canvasRef.current;
// Creating context
this.context = canvas.getContext('2d');
}
render() {
return (
<div className="workspace">
<canvas className="canvas" ref={this.canvasRef}></canvas>
</div>
)
}
}
2个回答
如果您从上到下阅读代码,则在调用
render
方法之前,canvas 元素尚不存在。因此,您必须等待组件实际渲染一次才能创建上下文。
更具体地说,等待调用
componentDidMount
方法,然后在其中创建上下文。
import React, { Component } from 'react';
import './Workspace.css';
// Workspace component is resposiable for drawing defferent elements on the screen
// It uses canvas API to draw elements and the stuff like that
export default class Workspace extends Component {
constructor(props) {
// Calling parent`s constructor function
super(props);
// All objects that will be drawn
this.objects = [];
// Creating the `canvasRef` ref for having access to the canvas element
this.canvasRef = React.createRef();
}
componentDidMount() {
// Getting the canvas element, using the`canvasRef` ref
const canvas = this.canvasRef.current;
// Creating context
this.context = canvas.getContext('2d');
}
render() {
return (
<div className="workspace">
<canvas className="canvas" ref={this.canvasRef}></canvas>
</div>
)
}
}
Emiel Zuurbier
2020-10-22
this.canvasRef
只能在 componentDidMount 中访问
componentDidMount 在 ref 回调之前调用
接受的答案将为您提供更多信息。美好的一天!
jmk
2020-10-22