• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Canvas w jsx React nie wyświetlają się kropki

Object Storage Arubacloud
0 głosów
68 wizyt
pytanie zadane 18 lutego 2023 w JavaScript przez chrystian Gaduła (4,780 p.)

Hej,

Mam problem nie wyświetlają mi się kropki po najechaniu myszką sam canvas wyłapuje cordsUpdate ale nie ma żadnej reakcji na ekran nie wiem czym jest to spowodowane 

import React, { useEffect, useRef, useState } from "react";
function Canvas() {
	//  <!-- inspiration was taken from 'juliangarnier'" -->

	const [drawing, SetDrawing] = useState(false);
	//creating refernes to jsx object
	const canvasRef = useRef(null);
	useEffect(() => {
		if (!canvasRef.current) {
			return;
		}

		const canvas = canvasRef.current;
		const context = canvas.getContext("2d");
		//function setting Window Size
		function windowSize() {
			canvas.width = window.innerWidth * 2;
			canvas.height = window.innerHeight * 2;
			canvas.style.height = window.innerHeight + "px";
			canvas.style.width = window.innerWidth + "px";
			context.scale(2, 2);
		}
		//Updating the mouse cords
		const CordsUpdate = {
			x: undefined,
			y: undefined,
		};
		// Array of all parts
		let PartArray = [];
		//colors of cirlce
		let colorsofCircles = ["#780000", "#c1121f", "#fdf0d5", "#003049", "#669bbc"];
		let numberOfCircles = 5;
		//constructor adds new Particles
		function Part() {
			//setting variables to mousemove
			this.x = CordsUpdate.x;
			this.y = CordsUpdate.y;
			//Size of circle
			this.radius = Math.random() * 15 + 1;
			//direction of circles
			this.motionX = Math.random() * 4 - 2;
			this.motiony = Math.random() * 4 - 2;
			this.color = colorsofCircles[Math.round(Math.random() * this.colorsofCircles.length - 1)];
		}
		//animation moving and shrink circles
		Part.prototype.motion = function () {
			this.x += this.motionX;
			this.y += this.motionY;
			if (this.radius > 0.1) this.radius -= 0.1;
		};
		//Creating a cricle
		Part.prototype.draw = function () {
			context.fillStyle = this.color;
			context.beginPath();
			context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
			context.fill();
		};
		//trigger motion and draw
		function makeThemBe() {
			for (let i = 0; i < PartArray.length; i++) {
				PartArray[i].motion();
				PartArray[i].draw();
				if (PartArray[i].radius <= 0.3) {
					PartArray.splice(i, 1);
					i--;
				}
			}
		}
		//display
		function animate() {
			context.clearRect(0, 0, canvas.width, canvas.height);
			makeThemBe();
			requestAnimationFrame(animate);
		}
		//mouse follow spray the circles
		canvas.addEventListener("mousedown", function () {
			SetDrawing((prev) => (prev = true));
		});
		canvas.addEventListener("mousemove", function (event) {
			if (drawing === true) {
				for (let i = 0; i < numberOfCircles.length; i++) {
					PartArray.push(new Part());
				}
				CordsUpdate.x = event.offsetX;
				CordsUpdate.y = event.offsetY;
			}
		});
		canvas.addEventListener("mousedown", function () {
			if (drawing === true) {
				SetDrawing((prev) => (prev = false));
			}
		});

		animate();
		windowSize();
		//clean up component
		return () => {
			window.removeEventListener("mousedown", function () {});
			canvas.removeEventListener("mousemove", function () {});
			canvas.removeEventListener("mousedown", function () {});
		};
	}, [drawing]);

	return <canvas ref={canvasRef}></canvas>;
}
export default Canvas;

 

1 odpowiedź

0 głosów
odpowiedź 19 lutego 2023 przez rafal.budzis Szeryf (85,260 p.)

Ten kod ma wiele problemów i jest mało czytelny. Po co piszesz w React skoro nie używasz React? ;)

Wydaje mi się że problemem może być:
 

const [drawing, SetDrawing] = useState(false);


Ponieważ akcja wymaga ponownego renderowania komponentu to useEffect wykona Ci się ponownie i wyczyści całą tablice PartArray. 

Ja używać więcej Reacta? Postaw na useRef! Ten hook może również pomóc nam w zapamiętywaniu wartości które nie wymagają ponownego renderowania komponentu. 

Obecny useState zmieniłbym na useRef właśnie. Następnie przeniósłbym wszystkie eventy związane z myszką do JSXa i pousuwał całość z useEffect. 

W useEffect powinna zostać tylko cześć odpowiedzialna za renderowanie czyli tylko funkcja animate. 

Stałe i klasy zadeklaruj poza komponentem ! colorsofCircles, numberOfCircles, function Part
do metody draw z klasy Part dodaj context jako parametr. 

Jak poukładasz kod aby był on czytelny i korzystał z Reacta wrzuć nową wersje jeśli dalej nie będzie działać to daj znać będziemy szukać innym problemów. ;)  

Podobne pytania

0 głosów
1 odpowiedź 367 wizyt
pytanie zadane 25 stycznia 2022 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)
0 głosów
1 odpowiedź 315 wizyt
pytanie zadane 21 maja 2021 w JavaScript przez Łukasz Smutek Nowicjusz (140 p.)
+1 głos
0 odpowiedzi 1,244 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...