El gancho useEffect React ejecutará la función pasada en cada cambio. Esto se puede optimizar para permitir que llame solo cuando cambien las propiedades deseadas.
¿Qué sucede si deseo llamar a una función de inicialización componentDidMount
y no volver a llamarla en los cambios? Digamos que quiero cargar una entidad, pero la función de carga no necesita ningún dato del componente. ¿Cómo podemos hacer esto usando el useEffect
gancho?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
Con ganchos esto podría verse así:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Dávid Molnár
fuente
fuente
TL; DR
useEffect(yourCallback, [])
- activará la devolución de llamada solo después del primer render.Explicación detallada
useEffect
se ejecuta por defecto después de cada renderizado del componente (causando así un efecto).Al colocar
useEffect
en su componente, le dice a React que desea ejecutar la devolución de llamada como efecto. React ejecutará el efecto después de renderizar y después de realizar las actualizaciones DOM.Si solo pasa una devolución de llamada, la devolución de llamada se ejecutará después de cada renderizado.
Si pasa un segundo argumento (matriz), React ejecutará la devolución de llamada después del primer render y cada vez que se cambie uno de los elementos de la matriz. por ejemplo, al realizar
useEffect(() => console.log('hello'), [someVar, someOtherVar])
la llamada: la devolución de llamada se ejecutará después del primer renderizado y después de cualquier renderizado que haya cambiadosomeVar
o que hayasomeOtherVar
cambiado.Al pasar el segundo argumento a una matriz vacía, React comparará después de cada renderización de la matriz y verá que no se cambió nada, por lo que llamará a la devolución de llamada solo después de la primera representación.
fuente
gancho useMountEffect
Ejecutar una función solo una vez después del montaje de componentes es un patrón tan común que justifica un gancho propio que oculta los detalles de implementación.
Úselo en cualquier componente funcional.
Sobre el gancho useMountEffect
Cuando se usa
useEffect
con un segundo argumento de matriz, React ejecutará la devolución de llamada después del montaje (representación inicial) y después de que los valores en la matriz hayan cambiado. Como pasamos una matriz vacía, se ejecutará solo después del montaje.fuente
useMount
cuando su función de efecto necesita algo de accesorios pero nunca necesita ejecutarse nuevamente, incluso si ese valor cambia sin advertencia de linter:useEffect(()=>console.log(props.val),[])
faltará una advertencia de dependencia perouseMount(()=>console.log(props.val))
no causará una advertencia pero "funciona". Sin embargo, no estoy seguro de si habrá un problema con el modo concurrente.Pase una matriz vacía como segundo argumento a
useEffect
. Esto efectivamente le dice a React, citando los documentos :Aquí hay un fragmento que puede ejecutar para mostrar que funciona:
fuente
Me gusta definir una
mount
función, engaña a EsLint de la misma manerauseMount
y me parece más explicativo.fuente
El truco es que useEffect toma un segundo parámetro.
El segundo parámetro es una matriz de variables que el componente verificará para asegurarse de que haya cambiado antes de volver a renderizar. Podrías poner cualquier trozo de utilería y el estado que quieras aquí para verificarlo.
O no ponga nada:
Eso asegurará que useEffect solo se ejecute una vez.
Nota de los documentos:
Si usa esta optimización, asegúrese de que la matriz incluye todos los valores del alcance del componente (como accesorios y estado) que cambian con el tiempo y que son utilizados por el efecto. De lo contrario, su código hará referencia a valores obsoletos de renders anteriores.
fuente