Permítanme explicar el resultado de este código para preguntar mi problema fácilmente.
const ForExample = () => {
const [name, setName] = useState('');
const [username, setUsername] = useState('');
useEffect(() => {
console.log('effect');
console.log({
name,
username
});
return () => {
console.log('cleaned up');
console.log({
name,
username
});
};
}, [username]);
const handleName = e => {
const { value } = e.target;
setName(value);
};
const handleUsername = e => {
const { value } = e.target;
setUsername(value);
};
return (
<div>
<div>
<input value={name} onChange={handleName} />
<input value={username} onChange={handleUsername} />
</div>
<div>
<div>
<span>{name}</span>
</div>
<div>
<span>{username}</span>
</div>
</div>
</div>
);
};
Cuando se ForExample component
monte, se registrará el 'efecto'. Esto está relacionado con el componentDidMount()
.
Y cada vez que cambio la entrada de nombre, se registrarán tanto el 'efecto' como la 'limpieza'. Viceversa, no se registrará ningún mensaje cada vez que cambie la entrada del nombre de usuario desde que agregué [username]
al segundo parámetro de useEffect()
. Esto está relacionado con lacomponentDidUpdate()
Por último, cuando se ForExample component
desmonte, se registrará 'limpiado'. Esto está relacionado con el componentWillUnmount()
.
Todos sabemos eso.
En resumen, se invoca 'limpiado' cada vez que el componente se vuelve a renderizar (incluye desmontar)
Si quiero que este componente se registre 'limpiado' solo en el momento en que se desmonte, solo tengo que cambiar el segundo parámetro de useEffect()
a []
.
Pero si cambio [username]
a []
, ForExample component
ya no implementa la componentDidUpdate()
entrada de nombre.
Lo que quiero hacer es que, para que el componente admita componentDidUpdate()
solo para la entrada de nombre y componentWillUnmount()
. (registro 'limpiado' solo en el momento en que se desmonta el componente)
username
como segundo argumento, y uno al que se le da una matriz vacía como segundo argumento.