El estado es un objeto que contiene información que puede cambiar con el tiempo y que afecta a la representación del componente. Cada componente en React puede tener su propio estado, y cuando el estado cambia, React vuelve a renderizar el componente para reflejar esos cambios.
useState
En los componentes funcionales, el estado se maneja mediante el hook useState. El hook useState devuelve un par: el valor actual del estado y una función que permite actualizar ese estado.
useState
import React, { useState } from 'react';
function Counter() {
// Declarar una variable de estado llamada "count" con valor inicial de 0
const [count, setCount] = useState(0);
return (
<div>
<p>Has hecho clic {count} veces</p>
<button onClick={() => setCount(count + 1)}>
Haz clic aquí
</button>
</div>
);
}
export default Counter;
En este ejemplo:
useState(0) inicializa el estado count con un valor de 0.
count contiene el valor actual del estado.
setCount es la función que actualiza el estado.
setCount(count + 1) incrementa el valor de count.
En componentes de clase, el estado se inicializa en el constructor y se actualiza usando this.setState.
import React, { Component } from 'react';
class Counter extends Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
incrementCount = () => {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<div>
<p>Has hecho clic {this.state.count} veces</p>
<button onClick={this.incrementCount}>
Haz clic aquí
</button>
</div>
);
}
}
export default Counter;
En este ejemplo:
this.state = { count: 0 } inicializa el estado count en el constructor.
this.setState se usa para actualizar el estado.
this.setState({ count: this.state.count + 1 }) incrementa el valor de count.
Es importante distinguir entre estado y props:
import React, { useState } from 'react';
function ChildComponent({ message }) {
return <p>{message}</p>;
}
function ParentComponent() {
const [state, setState] = useState("Hola desde el estado");
return (
<div>
<ChildComponent message={state} />
<button onClick={() => setState("Estado actualizado")}>
Actualizar Estado
</button>
</div>
);
}
export default ParentComponent;
En este ejemplo:
ParentComponent tiene un estado state.
ChildComponent recibe message como prop.
ParentComponent se actualiza y ChildComponent recibe la nueva prop.
Para manejar estados más complejos, se puede utilizar un objeto para representar múltiples valores de estado.
import React, { useState } from 'react';
function Form() {
const [formState, setFormState] = useState({
name: '',
email: '',
message: ''
});
const handleChange = (e) => {
const { name, value } = e.target;
setFormState({
...formState,
[name]: value
});
};
return (
<form>
<input
type="text"
name="name"
value={formState.name}
onChange={handleChange}
placeholder="Nombre"
/>
<input
type="email"
name="email"
value={formState.email}
onChange={handleChange}
placeholder="Email"
/>
<textarea
name="message"
value={formState.message}
onChange={handleChange}
placeholder="Mensaje"
/>
<button type="submit">Enviar</button>
</form>
);
}
export default Form;
En este ejemplo:
formState es un objeto que contiene varios valores de estado (name, email, message).
handleChange actualiza el estado correspondiente cuando el usuario escribe en los campos del formulario.
useReducer
Para estados muy complejos o cuando hay múltiples transiciones de estado, se recomienda usar useReducer.
useReducer
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
<p>Has hecho clic {state.count} veces</p>
<button onClick={() => dispatch({ type: 'increment' })}>
Incrementar
</button>
<button onClick={() => dispatch({ type: 'decrement' })}>
Decrementar
</button>
</div>
);
}
export default Counter;
En este ejemplo:
useReducer maneja un estado complejo mediante una función reductora (reducer).
dispatch se utiliza para enviar acciones que actualizan el estado.
El estado en React es fundamental para crear componentes interactivos y dinámicos. Permite manejar y responder a cambios en los datos, actualizando la interfaz de usuario de manera eficiente. Desde el uso básico de useState en componentes funcionales hasta el manejo de estados complejos con useReducer, React proporciona herramientas poderosas para gestionar el estado de la aplicación. Entender y utilizar correctamente el estado es clave para desarrollar aplicaciones React robustas y mantenibles.
Jorge García
Fullstack developer