react-puro-19
  • React Puro - 19
  • code
    • README
    • README
    • README
    • README
    • README
    • README
    • README
    • README
  • 7-state-en-clases
    • Ejemplo inicial: un contador
    • Manejo de eventos
    • El state
    • Sintaxis limpia en Class Components
    • setState es Asincrónico
    • Fusión superficial vs profunda
  • 5-children
    • Personalizar Children antes de renderizar
    • PropTypes para Children
    • Los Children
    • Diferentes tipos de Children
    • Manejando uso Children
  • 13-hook-usereducer
    • Qué es un Reducer?
    • Un ejemplo más practico
    • Entonces, Redux murió?
  • 4-proptypes
    • Documentación y depuración incluida
    • PropTypes como documentación
    • Cómo validar, formas comunes
    • Ejemplo Tweet con PropTypes
  • 3-props
    • Comunicación con componentes Padre
    • Las Props:
    • Pasar Props
    • Recibir Props
    • Ejemplo Tweet con Props
  • 11-pensando-uso-state
    • "Tipos" de componentes
    • Qué colocar en el State
    • Dónde mantener el estado
    • Pensando declarativamente
  • 9-requests-api
    • Intro
    • Eligir libreria HTTP
    • Obtener datos y mostrarlos
  • 10-state-en-funciones
    • El useState Hook
    • Actualizar State basado en State anterior
    • State como un Array
    • Reglas de los Hooks
    • La "magia" de los Hooks
    • State como un Objeto
    • Intro Hooks
  • 15-api-context
    • Usando React API Context
    • Patrón "Slots"
    • Patrón "Render Props"
    • Intro API Context
    • Otros Patrones de Context
    • Ejemplo perforación de props
    • hook_usecontext
  • 8-ciclo-vida-componente
    • Fases
    • El ciclo
    • Manejo de errores
    • Desmontaje
    • Representación
    • Montaje
  • 14-hook-useeffect
    • Límite cuando se ejecuta un Effect
    • Hacer cambios visibles del DOM
    • Obtener datos (Fetch) con useEffect
    • Intro useEffect
    • Re-obtener datos (Re-Fetch) cuando cambian
    • Solo ejecución en montaje y desmontaje
  • 2-jsx
    • Ejemplo componente Tweet:
    • JSX:
    • Trabajando con JSX:
  • 12-controles-entrada
    • Entradas controladas
    • Entradas no controladas
  • 6-github-file-list
    • Parte 2: la Prop 'key'
    • Parte inicial
  • 1-hola_mundo
    • Hola mundo:
Con tecnología de GitBook
En esta página

¿Te fue útil?

  1. 14-hook-useeffect

Límite cuando se ejecuta un Effect

A veces, solo se querrá que se ejecute un efecto en respuesta a un cambio específico. Tal vez cuando el valor de una prop cambia o se produce un cambio en el state. Para eso es el segundo argumento de useEffect: es una lista de dependencias.

Aquí un ejemplo que trata de: "Si la prop blogPostId cambia, descargar esa publicación de blog y mostrarla":

useEffect(() => {
    fetch(`${config.url}/posts/${blogPostId}`)
    .then(content =>
    setContent(content)
    )
}, [blogPostId])

En este: "Si el nombre de usuario cambia, guardar en localStorage":

useEffect(() => {
    localStorage.setItem('username', username)
}, [username])

En este indica: "Tan pronto como el usuario ingrese la contraseña correcta, mostrar el secreto":

useEffect(() => {
    if (passcode === '1234') {
        setShowSecret(true);
    }
}, [passcode])

Se observa cómo ese código continuará mostrando el secreto incluso si el usuario cambia la contraseña? Funciona como desbloquear una caja fuerte. Si escriben "1234", aparecerá el secreto. Si luego presionan la tecla de retroceso y la cambian a "123", el secreto aún se mostrará pues ya se cumplio la condición.

Comparar eso con esta versión, que ocultaría el secreto si cambiaran el código de acceso de "1234" a cualquier otra cosa:

useEffect(() => {
    setShowSecret(passcode === '1234');
}, [passcode])

La similitud clave con todos estos ejemplos es que incluyen el conjunto de dependencias como segundo argumento. Este array debe contener todos los valores que, si cambian, deberían hacer que el efecto se recalcule.

Enfocando entrada automáticamente

Se verá cómo poder enfocar un control de entrada en el primer renderizado, usando useEffect combinado con el hook useRef.

import React, { useState, useEffect, useRef } from 'react';
import ReactDOM from 'react-dom';

function App() {
    // Almacenar una referencia al nodo DOM del input
    const inputRef=useRef();

    // Almacenar el valor del input en el state
    const [value, setValue]=useState("");

    useEffect(
        () => {
            // Esto se ejecuta DESPUÉS del primer render, 
            // por lo que la referencia ya está establecida.
            console.log("render");
            inputRef.current.focus();
        },
        // El efecto "depende de" inputRef
        [inputRef]
    );

    return (
        <input
            ref={inputRef}
            value={value}
            onChange={e => setValue(e.target.value)}
        />
    );
}

ReactDOM.render(
    <App />,
    document.querySelector('#root')
)

En la parte superior, se esta creando una referencia vacía con useRef. Pasando a la prop de ref de la entrada se encarga de configurarlo una vez que se renderiza el DOM. Y, lo que es más importante, el valor devuelto por useRef será estable entre los renders.

Entonces, aunque se este pasando [inputRef] como el segundo argumento de useEffect, efectivamente solo se ejecutará una vez, justo después de que se monte el componente. Esto es básicamente "componentDidMount" (excepto el momento preciso del mismo).

Si se prueba escribiendo el ejemplo. Observar que la entrada se enfoca automáticamente en la carga de la página. Luego intentar escribir en el cuadro de texto. Cada caracter desencadena un re-render, pero si se mira la consola, se verá que "render" solo se imprime una vez. UseEffect está mirando el valor de inputRef cada vez, viendo que no ha cambiado desde el render anterior, y luego decide no ejecutar su función de efecto.

Otra forma de pensar en este array de dependencias es: debe contener todas las variables que la función de efecto utiliza desde el alcance circundante. Entonces, si se usa una prop? Eso va en ese array. Si se usa un parte del state? Eso va en ese array.

Anterior14-hook-useeffectSiguienteHacer cambios visibles del DOM

Última actualización hace 5 años

¿Te fue útil?

captura1