Saltar al contenido

Renderizar en la ventana Redimensionar en reacción

Un escenario más «real» para manejar eventos de redimensionamiento es cuando se dibuja en un lienzo. Es muy probable que la escala del lienzo tenga que cambiar al cambiar el tamaño de la pantalla. Ahora construiremos un componente que renderizará un lienzo, dibujará algunas formas en él, y redibujará esas formas a la escala correspondiente cada vez que el navegador sea redimensionado.

Primero, necesitamos una función que tome un lienzo, la escala como parámetro, y dibuje algo en él:

Renderizar en la ventana Redimensionar en reacción
Renderizar en la ventana Redimensionar en reacción
123456789101112131415161718192021functiondraw(canvas, scaleX, scaleY){const context = canvas.getContext("2d"); context.scale(scaleX, scaleY); context.clearRect(0,0, canvas.clientWidth, canvas.clientHeight); context.beginPath(); context.setLineDash([]); context.lineWidth=2; context. strokeStyle="rojo"; context.moveTo(0,100); context.lineTo(scaleWidth,100); context.moveTo(0,400); context.lineTo(scaleWidth,400); context.stroke(); context.lineWidth=1; context.strokeStyle="azul"; context.fillStyle="azul"; context.rect(200,200,100,100); context.fill(); context.closePath();}

javascript

Esta función obtiene un contexto de dibujo 2D, lo escala según los parámetros, lo borra y dibuja dos líneas y un rectángulo sólido.

También necesitamos un elemento de lienzo sobre el que dibujar. Necesitamos mantener una referencia a este lienzo usando el gancho useRef; esto permite que el elemento del lienzo sea accedido en otra parte dentro del código del componente:

12const canvas =React.useRef(null);return<canvas ref={canvas} style={{{ancho: "100%", altura: "100%"}}/{{i};;

javascript

El ref se inicializa a nulo y se establece en el elemento de lona por el atributo ref en el elemento. Para acceder al elemento de lienzo referenciado se utiliza canvas.current.

Necesitaremos una función que se llame cuando se cambie el tamaño del lienzo que establezca las propiedades de ancho y alto del lienzo al ancho y alto real del lienzo y que establezca la escala del tamaño de la ventana actual. Para los propósitos de esta guía, se usará esta función que usa un ancho y alto de 500 para ser una escala de uno:

12345678constcalculateScaleX=()=> canvas.current.clientWidth/ scaleWidth;constcalculateScaleY=()=> canvas.current.clientHeight/ scaleHeight;constresized=()=>{ canvas. current.width= canvas.current.clientWidth; canvas.current.height= canvas.current.clientHeight;setScale({ x:calculateScaleX(), y:calculateScaleY()});};

javascript

La escala necesita ser almacenada en estado de componente y será inicializada a una en ambos ejes de esta manera:

1const[escala, setScale]=Reaccionar.usarEstado({ x:1, y:1});

javascript

Cada vez que se cambia el tamaño de la ventana del navegador, necesitamos calcular la escala y actualizar el valor almacenado en el estado de los componentes. Como en el ejemplo anterior, esto se hace usando el gancho de efecto sin segundo parámetro para añadir y quitar oyentes para el evento de redimensionamiento, esta vez llamando a la función de redimensionamiento:

12345React.useEffect(()= >{const currentCanvas = canvas.current; currentCanvas.addEventListener("resize", redimensionado);return()=> currentCanvas.removeEventListener("resize", redimensionado);});

javascript

Por último, necesitamos dibujar en el lienzo siempre que la escala cambie. Para ello podemos, de nuevo, utilizar el gancho de efecto pero, esta vez, le daremos un segundo parámetro del valor del estado de la escala. Esto significa que el gancho sólo se ejecutará cuando se cambie la escala. Dentro del gancho, simplemente tenemos que llamar a la función de dibujo pasando el lienzo y las escalas como parámetros:

123React.useEffect(()=,[escala]);

javascript

El componente ahora cambia la escala del lienzo y lo redibuja cada vez que se cambia el tamaño del navegador. El código de este componente se puede encontrar aquí.