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. 7-state-en-clases

setState es Asincrónico

En el ejemplo anterior del contador en parte se mintio un poco. Se supuso que la función setState actualizaría de inmediato el estado y llamaría a render. Eso no es realmente lo que sucede. La función setState es realmente asíncrona.

Si se llama a setState e inmediatamente console.log(this.state) justo después, es muy probable que imprima el estado anterior en lugar del que se acaba de configurar.

// Asumir que el estado es { count: 3 }
// Luego llamar setState:
this.setState({ count: 4 });

// Luego intentar imprimir el estado "nuevo":
console.log(this.state);

// Es probable que imprima { count: 3 }
// en vez de { count: 4 }

Si se necesita establecer el estado e inmediatamente actuar sobre ese cambio, se puede pasar una función de devolución de llamada (callback) como segundo argumento para setState, así:

this .setState({name : 'Zero'}, function () {
    // llamado después de que el estado ha sido actualizado
    // y el componente se ha vuelto a representar
    // this.state ahora contiene { name: 'Zero' }
});

setState funcional

Otra forma de hacer que las actualizaciones de estado secuenciales se ejecuten en secuencia es usar la forma funcional de setState, como esta:

this .setState((state, props) => {
    return {
        value : state.value + 1
    }
});

De esta forma, se pasa una función a setState en lugar de un objeto. La función recibe el estado actual y las props como argumentos, y se espera que devuelva un objeto, que se fusionará con el estado anterior. Si se tuviera que ejecutar algunos de estos secuencialmente ...

this.setState((state, props) => {
    return {
        value: state.value + 1
    }
});

this.setState((state, props) => {
    return {
        value: state.value + 1
    }
});

this.setState((state, props) => {
    return {
        value: state.value + 1
    }
});

Esto funcionaría como se espera, eventualmente incrementando el valor en 3.

Porque cada llamada a setState "pone en cola" una actualización en el orden en que se llama, y cuando se ejecutan, reciben el último estado como argumento en lugar de usar un this.state potencialmente obsoleto.

Un beneficio adicional para el estilo funcional de setState es que las funciones de actualización de estado pueden extraerse de la clase y reutilizarse porque son funciones "puras", es decir, solo operan en sus argumentos, no modifican los argumentos y devuelven un nuevo valor. Una función "pura" no tiene efectos secundarios, lo que significa que llamarla varias veces con los mismos argumentos siempre devolverá el mismo resultado.

setState funcional es la forma preferida de llamar a setState porque está garantizado que funciona correctamente, siempre.

Pasar un objeto a setState funciona bien la mayor parte del tiempo, pero es casi como jugar con fuego. Esta bien hasta que uno se quema y luego se pasen alrededor 30 minutos tratando de descubrir por qué el estado no se está actualizando.

AnteriorSintaxis limpia en Class ComponentsSiguienteFusión superficial vs profunda

Última actualización hace 5 años

¿Te fue útil?