React钩子useEffect有助于在React的功能组件中添加componentDidUpdate和componentDidMount组合生命周期。
到目前为止,我们知道我们只能在有状态组件中添加生命周期方法。
要使用它,我们需要从react导入它-
import React, { useEffect } from ‘react’; const tutorials=(props)=>{ useEffect( ()=>{ console.log(‘hello’); setTimeout( ()=>{ alert(‘hello’); }, 2000); }); }
如果运行它,我们将在每个渲染周期看到控制台日志并发出警报。在这里,我们也可以在useEffect中调用http请求。现在,这类似于有状态组件的componentDidUpdate生命周期。
我们可以在单个组件中添加多个useEffect函数。
将空数组作为第二个参数传递给useEffect函数调用,使其像componentDidMount一样工作。
const tutorials=(props)=>{ useEffect( ()=>{ console.log(‘hello’); setTimeout( ()=>{ alert(‘hello’); }, 2000); }, [] ); }
我们可以将第二个参数传递给useEffect,如果第二个参数有任何变化,那么React将执行此useEffect函数调用。
下面显示的第二个参数是一个数组,这意味着我们可以在该数组内添加多个元素。
import React, { useEffect } from ‘react’; const tutorials=(props)=>{ useEffect( ()=>{ console.log(‘hello’); setTimeout( ()=>{ alert(‘hello’); }, 2000); }, [props.player]); }
在useEffect内部,我们可以在函数调用的末尾添加return语句,该语句返回一个函数。此返回函数执行清理工作。清理工作的执行频率还取决于传递给useEffect函数的第二个参数。
import React, { useEffect } from ‘react’; const tutorials=(props)=>{ useEffect( ()=>{ console.log(‘hello’); setTimeout( ()=>{ alert(‘hello’); }, 2000); return ( ()=>{ console.log(‘cleanup on change of player props’); }); }, [props.player]); }
我们知道,componentWillUnmount 执行时组件从实际的DOM中删除。同样,如果我们将useEffect与第二个空参数一起使用并添加返回函数调用,则它将作为componentWillUnmount'
const tutorials=(props)=>{ useEffect( ()=>{ console.log(‘hello’); setTimeout( ()=>{ alert(‘hello’); }, 2000); return ( ()=>{ console.log(‘cleanup similar to componentWillUnmount’); }); }, []); }
在上面的代码示例中,我们确定将三个生命周期组合在一个函数useEffect中。这些生命周期是componentDidUpdate,componentDidMount和componentWillUnmount。
在useEffect中添加return语句是可选的,这意味着清理工作是可选的,并取决于用例。
如果我们使用多个useEffect,则它们将按照与声明相同的顺序执行。
给定正确的第二个参数,我们可以优化useEffect的性能。
仅当更改了指定的第二个参数时,useEffect才会触发。
useEffe ct中的代码执行异步发生。还有另一个类似于useEffect的钩子,但是它以同步方式工作。它称为useLayoutEffect。
由于useLayoutEffect的执行是同步发生的,因此在调用完成之前,它可能会阻止可视更新一段时间。因此,应在非常特定的用例中使用它,而在常见用例中首选标准useEffect。
还有一个钩子可用于调试以及与第三方库(例如Redux)一起使用。称为useDebugValue来显示自定义挂钩的标签。