No se puede utilizar cualquiera de los métodos de ciclo de vida existentes ( componentDidMount
, componentDidUpdate
, componentWillUnmount
etc.) en un gancho. Solo se pueden usar en componentes de clase. Y con Hooks solo puede usar en componentes funcionales. La siguiente línea proviene del documento React:
Si está familiarizado con los métodos del ciclo de vida de clase Reaccionar, se puede pensar en useEffect
gancho como componentDidMount
, componentDidUpdate
y componentWillUnmount
combinado.
sugerir es que puede imitar estos métodos de ciclo de vida del componente de clase en componentes funcionales.
El código interno se componentDidMount
ejecuta una vez cuando el componente está montado. useEffect
gancho equivalente para este comportamiento es
useEffect(() => {
// Your code here
}, []);
Observe el segundo parámetro aquí (matriz vacía). Esto se ejecutará solo una vez.
Sin el segundo parámetrouseEffect
, se llamará al gancho en cada render del componente que puede ser peligroso.
useEffect(() => {
// Your code here
});
componentWillUnmount
se usa para la limpieza (como eliminar oyentes de eventos, cancelar el temporizador, etc.). Supongamos que está agregando un detector de eventos componentDidMount
y eliminándolo componentWillUnmount
como se muestra a continuación.
componentDidMount() {
window.addEventListener('mousemove', () => {})
}
componentWillUnmount() {
window.removeEventListener('mousemove', () => {})
}
El equivalente de gancho del código anterior será el siguiente
useEffect(() => {
window.addEventListener('mousemove', () => {});
// returned function will be called on component unmount
return () => {
window.removeEventListener('mousemove', () => {})
}
}, [])
useEffect()
función, gracias.componentWillMount
componentWillMount
, nocomponentWillUnmount
. De hecho, esta respuesta no responde a la pregunta, y solo reitera lo que el OP ya implicaba saber.useComponentDidMount hook
En la mayoría de los casos
useComponentDidMount
es la herramienta a utilizar. Se ejecutará solo una vez, después de que el componente se haya montado (renderizado inicial).useComponentWillMount
Es importante tener en cuenta que los componentes en clase
componentWillMount
se consideran heredados. Si necesita que el código se ejecute solo una vez antes de que se haya montado el componente, puede usar el constructor. Más sobre esto aquí . Dado que el componente funcional no tiene el equivalente de un constructor, usar un gancho para ejecutar código solo una vez antes de los montajes de componentes puede tener sentido en ciertos casos. Puedes lograrlo con un gancho personalizado.Sin embargo, hay una trampa. No lo use para establecer asincrónicamente su estado (por ejemplo, después de una solicitud del servidor. Como es de esperar que afecte a la representación inicial que no lo hará). Tales casos deben ser manejados con
useComponentDidMount
.Manifestación
Demo completa
fuente
componentWillMount
basada enuseEffect
tiene dos problemas. La primera es que no hay un ciclo de vida de montaje en los componentes funcionales, ambos ganchos se ejecutarán después de que el componente se haya procesado, por lo queRuns only once before component mounts
es engañoso. El segundo es quecomponentWillMount
se llama en la representación del servidor yuseEffect
no lo es. Muchas bibliotecas aún dependenUNSAFE_componentWillMount
porque actualmente es la única forma de activar un efecto secundario en el lado del servidor.Según reactjs.org, componentWillMount no será compatible en el futuro. https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
No hay necesidad de usar componentWillMount.
Si desea hacer algo antes de montar el componente, simplemente hágalo en el constructor ().
Si desea hacer solicitudes de red, no lo haga en componentWillMount. Es porque hacer esto conducirá a errores inesperados.
Las solicitudes de red se pueden hacer en componentDidMount.
Espero eso ayude.
actualizado el 08/03/2019
La razón por la que solicita componenteWillMount es probablemente porque desea inicializar el estado antes de los renders.
Solo hazlo en useState.
o tal vez desee ejecutar una función en componentWillMount, por ejemplo, si su código original se ve así:
con hook, todo lo que necesita hacer es eliminar el método del ciclo de vida:
Solo quiero agregar algo a la primera respuesta sobre useEffect.
useEffect se ejecuta en cada render, es una combinación de componentDidUpdate, componentDidMount y ComponentWillUnmount.
Si agregamos una matriz vacía en useEffect, se ejecuta justo cuando se monta el componente. Esto se debe a que useEffect comparará la matriz que le pasó. Por lo tanto, no tiene que ser una matriz vacía, puede ser una matriz que no cambia. Por ejemplo, puede ser [1,2,3] o ['1,2']. useEffect todavía solo se ejecuta cuando se monta un componente.
Depende de usted si desea que se ejecute solo una vez o después de cada renderizado. No es peligroso si olvidó agregar una matriz siempre que sepa lo que está haciendo.
Creé una muestra para hook. Por favor, míralo.
https://codesandbox.io/s/kw6xj153wr
actualizado el 21/08/2019
Ha sido blanco desde que escribí la respuesta anterior. Hay algo a lo que creo que debes prestarle atención. Cuando usas
Cuando reacciona compara los valores que pasó a la matriz [], utiliza Object.is () para comparar. Si le pasa un objeto, como
Esto es exactamente lo mismo que:
Se volverá a representar cada vez porque cuando Object.is () compara un objeto, compara su referencia, no el valor en sí. Es lo mismo que por qué {} === {} devuelve falso porque sus referencias son diferentes. Si aún desea comparar el objeto en sí, no la referencia, puede hacer algo como esto:
fuente
useLayoutEffect
podría lograr esto con un conjunto vacío de observadores ([]
) si la funcionalidad es realmente similar acomponentWillMount
: se ejecutará antes de que el primer contenido llegue al DOM, aunque en realidad hay dos actualizaciones pero son sincrónicas antes de dibujar en la pantalla.por ejemplo:
El beneficio se obtiene
useState
con un inicializador / configurador ouseEffect
si es que puede calcular un pase de renderizado, no hay re-renderizaciones reales al DOM que un usuario notará, y se ejecuta antes del primer renderizado notable, que no es el caso parauseEffect
. La desventaja es, por supuesto, un ligero retraso en su primer render ya que debe realizarse una verificación / actualización antes de pintar en la pantalla. Sin embargo, realmente depende de su caso de uso.Pienso personalmente
useMemo
está bien en algunos casos de nicho en los que necesitas hacer algo pesado, siempre y cuando tengas en cuenta que es la excepción frente a la norma.fuente
Así es como simulo constructor en componentes funcionales usando el
useRef
gancho:Aquí está el ejemplo del ciclo de vida:
Por supuesto, los componentes de la clase no tienen
Body
pasos, no es posible hacer una simulación 1: 1 debido a los diferentes conceptos de funciones y clases.fuente
Escribí un enlace personalizado que ejecutará una función una vez antes del primer render.
useBeforeFirstRender.js
Uso:
fuente
Hay una buena solución para implementar
componentDidMount
ycomponentWillUnmount
conuseEffect
.Según la documentación,
useEffect
puede devolver una función de "limpieza". Esta función no se invocará en la primerauseEffect
llamada, solo en las siguientes.Por lo tanto, si usamos el
useEffect
gancho sin dependencias, se llamará al gancho solo cuando el componente esté montado y la función de "limpieza" se llamará cuando el componente esté desmontado.La llamada a la función de devolución de limpieza se invoca solo cuando el componente está desmontado.
Espero que esto ayude.
fuente
useEffect
llamada obtienes la misma funcionalidad decomponentWillMount
ycomponentWillUnmount
de una manera agradable y limpiauseEffect
solo se ejecuta después de un render mientras secomponentWillMount
ejecuta antes de que el componente rinda.componentDidMount
nocomponentWillMount
. Eché de menos eso en la pregunta, mi mal.Puede hackear el enlace useMemo para imitar un evento de ciclo de vida componentWillMount. Solo haz:
Debería mantener el gancho useMemo antes de cualquier cosa que interactúe con su estado. No es así como se pretende, pero funcionó para mí para todos los problemas de componentWillMount.
Esto funciona porque useMemo no requiere devolver un valor y no tiene que usarlo como algo, pero como memoriza un valor basado en dependencias que solo se ejecutará una vez ("[]") y está encima de nuestro componente. se ejecuta una vez cuando el componente se monta antes que nada.
fuente
https://reactjs.org/docs/hooks-reference.html#usememo
fuente
La respuesta de Ben Carp me parece válida.
Pero dado que estamos utilizando formas funcionales, solo otro enfoque puede beneficiarse del cierre y HoC:
Entonces úsalo:
fuente
Respuesta corta a su pregunta original , cómo
componentWillMount
se puede usar con React Hooks:componentWillMount
está en desuso y se considera legado . Reaccionar recomendación :Ahora, en las Preguntas frecuentes de Hook , descubrirá cuál es el equivalente de un constructor de clase para componentes de funciones:
Entonces, un ejemplo de uso se
componentWillMount
ve así:fuente
Simplemente agregue una matriz de dependencia vacía en useEffect, funcionará como
componentDidMount
.fuente
Hay un truco simple para simular
componentDidMount
ycomponentWillUnmount
usandouseEffect
:fuente