开发者问题收集

.getContext 不是 ReactJs 函数

2022-11-24
751

我试图使用 GSAP 在我的 React 应用程序中制作滚动动画,但是当我将其链接到画布时,我不断收到错误 .getContext 不是一个函数。

我的计划是创建一个类似于翻书之类的滚动动画

任何建议都将非常感谢

谢谢

import { useRef } from "react";
import gsap from "gsap";
import ScrollTrigger from "gsap/ScrollTrigger";

function Landing() {
  const canvasRef = useRef();
  canvasRef.width = window.innerWidth;
  canvasRef.height = window.innerHeight;
  const context = canvasRef.getContext("2d");
  const frameCount = 230;

  const currentFrame = (index) =>
    `../../assets/landing-animations/${(index + 1).toString()}.jpg`;
  const images = [];
  let ball = { frame: 0 };

  for (let i = 0; i < frameCount; i++) {
    const img = new Image();
    img.src = currentFrame(i);
    images.push(img);
  }

  images[0].onload = render;

  function render() {
    context.clearRect(0, 0, canvasRef.width, canvasRef.height);
    context.drawImage(images[ball.frame]);
  }
  return (
    <div className="landing">
      <h1 className="landing__header">Welcome to my portfolio</h1>
      <canvas className="landing__canvas" ref={canvasRef}></canvas>;
    </div>
  );
}

export default Landing;
2个回答

需要访问 current ,因为对节点的引用可以在 ref 的 current 属性处访问。

另外用 useMemo 包装它以检测对 canvasRef 的更改

const context = useMemo(() => canvasRef?.current.getContext("2d"), [canvasRef])
Sachila Ranawaka
2022-11-24

需要添加 .current 来访问 .getContext

canvasRef.current.getContext("2d")

尝试添加 useEffect 并查看结果

 useEffect(()=>{
     if(!!canvasRef){
       console.log(canvasRef.current.getContext("2d"))
     }
 },[canvasRef])
Mohammad Abu-hummos
2022-11-24