Lección 18. Hook useEffect.

useEffect permite reprensetar el ciclo de vida de un componente funcional.

Podemos utilizar tantos `useEffect` como necesitemos.

Importar useEffect._

Para importar el ***Hook*** de `useEffect` utilizamos la desestructuración:

Copiar código
import { useEffect } from "react";

Tambien podemos importar varios hooks y elementos en la misma linea:

Copiar código
import React, { useState, useEffect } from "react";

***Nota:*** El `useState` es utilizado para estado, casi siempre los 2 ***hooks*** van de la mano.

Utilizar useEffect._

El uso de `useEffect` es similar a una ***collback***

Su sintaxis en un componente:

Copiar código
import React, {useState, useEffect} from "react";

export default function ScrollHooks() {

  useEffect(() => {
    //Aqui va codigo para la fase de montaje o actualizacion 
  });

  return(
    <>
      {/*Aqui va el codigo JSX a renderizar*/}
    </>
  )
}

Ejemplo simple._

A continuación, un código simple de uso de `useEffect`:

Copiar código
import React, {useState, useEffect} from "react";

export default function ScrollHooks() {

  useEffect(() => {
    console.log("fase de Actualizacion");
  });

  return(
    <>
      <h2>Hooks - useEffect y ciclo de vida</h2>
    </>
  )
}

***Nota:*** Este código imprime el consola el mensaje al momento de montar y actualizar el componente.

Ejemplo simple._

Un código común de un componente:

Copiar código
import React, {useState, useEffect} from "react";

export default function ScrollHooks() {
	//Creacion de estado
	const [scrollY, setscrollY] = useState(0)

	//Utilizacion de useEffect
	useEffect(() => {
		console.log("fase de Actualizacion");

		//Declaración de funcion para actualizar estado (no se esta ejecutando, solo se declaro)
		const detectarScroll = () => setscrollY(window.pageYOffset)

		//Asignar a la ventana del navegador en el evento "scroll" la función actualizadora detectarScroll (vanila JS)
		window.addEventListener("scroll", detectarScroll)
	});

	return(
		<>
			<h2>Hooks - useEffect y ciclo de vida</h2>
			<p>Scroll Y del navegador {scrollY} px</p>
		</>
	)
}

***Nota:*** Este componente tiene un estado llamado ***scrollY*** que se actualiza con una función actualizadora ***setscrollY*** (esta se ejecuta en la función ***detectarScroll*** que a su vez esta asignada al evento "scroll" de la ventana del navegador)

Esto renderizara en una etiqueta p, el valor del scroll.

***Nota:*** Este `useEffect` se ejecutará cada vez que se renderice o actualice el componente, si deseamos ser mas exactos, podemos aplicar una pequeña modificación (siguiente explicación.)

Ejemplo avanzado._

Existe un ***segundo parámetro*** que puede recibir el ***hook*** `useEffect`, el cual define en que parte del ciclo de vida del componente se ejecutará:

Esto se realiza con la sintaxis:

Copiar código
import React, {useState, useEffect} from "react";

export default function ScrollHooks() {

	useEffect(() => {
		//Aqui va codigo para la fase de montaje o actualizacion 
	}, [estadoGancho]);

	return(
		<>
			{/*Aqui va el codigo JSX a renderizar*/}
		</>
	)
}

Recibiendo un ***array***, donde dentro colocaremos los ***estados*** por los cuales se ejecutaran los `useEffet`.

Como el siguiente código ejemplo:

Copiar código
import React, {useState, useEffect} from "react";

export default function ScrollHooks() {

	//Creacion de estado
	const [scrollY, setscrollY] = useState(0)
	//Utilizacion de useEffect

    useEffect(() => {
		console.log("Moviendo el scroll");
      
		//Declaración de funcion para actualizar estado (no se esta ejecutando, solo se declaro)
		const detectarScroll = () => setscrollY(window.pageYOffset)

		//Asignar a la ventana del navegador en el evento "scroll" la función actualizadora detectarScroll
		window.addEventListener("scroll", detectarScroll)
	}, [scrollY]);
	//Cada que scrollY(Es un estado) cambie de valor

	useEffect(() => {
	    console.log("Fase de Montaje");
	}, [])
	//Solo en la fase de montaje (1 vez al principio)

	useEffect(() => {
		console.log("Fase de Actualizacion");
	})
    //Cada que el componente se actualice o renderice de nuevo

	return(
		<>
			<h2>Hooks - useEffect y ciclo de vida</h2>
			<p>Scroll Y del navegador {scrollY} px</p>
		</>
	)
}

Parametro Array en useEffect y su funcionamiento._

Para entender esto tiene un pequeño `Cheat-sheet`.