reactjs - HTML Canvas,带有 React 钩子(Hook)和 Typescript

标签 reactjs typescript canvas react-hooks use-effect

<分区>

我试图使用 React 钩子(Hook)和 Typescript 创建一个具有一些基本形状的 Canvas 元素,但我遇到了一个错误,其中 useEffect() 中的上下文可能为 null (ts2531)。

我假设这是因为默认情况下我的 canvasRef 为 null,但我有点不确定我还能将其设置为什么,或者是否有更好的方法来解决这个问题?

到目前为止,这是我的代码(编辑,下面的解决方案):

import React, { useRef, useEffect } from 'react';

interface CanvasProps {
    width: number;
    height: number;
}

const Canvas = ({ width, height }: CanvasProps) => {
    const canvasRef = useRef<HTMLCanvasElement>(null);

    useEffect(() => {
        if (canvasRef.current) {
            const canvas = canvasRef.current;
            const context = canvas.getContext('2d');  
            context.beginPath();
+           context.arc(50, 50, 50, 0, 2 * Math.PI);
+           context.fill(); 
        }       
    },[]);

    return <canvas ref={canvasRef} height={height} width={width} />;
};

Canvas.defaultProps = {
    width: window.innerWidth,
    height: window.innerHeight
};

export default Canvas;

根据 Alex Wayne 的快速回答,这是我更新后的 useEffect(),它可以正常工作。

    useEffect(() => {
    if (canvasRef.current) {
        const canvas = canvasRef.current;
        const context = canvas.getContext('2d');  
        if (context) {
            context.beginPath();
            context.arc(50, 50, 50, 0, 2 * Math.PI);
            context.fill(); 
        }

    }      

最佳答案

这是因为getContext可以返回null。文档:https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext

If the contextType doesn't match a possible drawing context, null is returned.

修复

确保它不是null 例如

        const context = canvas.getContext('2d');  
        if (context == null) throw new Error('Could not get context');
        // now safe

关于reactjs - HTML Canvas,带有 React 钩子(Hook)和 Typescript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60424853/

相关文章:

reactjs - 如何使用 React Router 和 useParams 钩子(Hook)在散列(#)之后检索参数?

TypeScript 类型强制指定类型之一

image - 背景图像没有以奇怪的方式显示在 Canvas 上

reactjs - 使用 React Router 和 Router

javascript - 箭头函数不触发

javascript - React useEffect 清理函数运行多次?

android - 在 Android Canvas 上,如何使用 drawText 调整跟踪、字母间距?

typescript - 没有完整命名空间的类型引用

TypeScript:如何在命名空间中使用内部接口(interface)

javascript - 尝试将 SVG 绘制到 Canvas ,为什么我的 SVG XML 被 chop 了?