В первый раз, когда вы пытаетесь получить доступ к ctx.current
, оно все еще не определено, потому что назначение внутри этого эффекта все еще не произошло:
useEffect(()=>{
ctx.current = canvasRef.current.getContext('2d')
},[])
Это потому, что эффект запускается после фаза рендеринга.
Вы должны сделать это внутри useEffect
вместо:
useEffect(()=>{
ctx.current = canvasRef.current.getContext('2d')
ctx.current.fillStyle= "green"
ctx.current.fillRect(20,20,150,100)
},[])