在继续往下之前 , 我们必须要知道一件事儿 , 在默认情况下 , useEffect Hook 在每次渲染和重新渲染时都会执行 。
因此 , 只要组件中的状态发生变化或组件收到新的props时 , 组件都会重新渲染并导致`useEffect Hook 再次运行 。
能不能只执行一次useEffect (就像 componentDidMount 一样)如果 useEffect Hook 在组件每次渲染时都运行 , 那么我们怎么才能做到 Hook 在挂载组件时仅运行一次?
例如 , 如果组件从接口获取数据 , 我们肯定不希望每次重新渲染组件时都去重新请求下数据吧?
useEffect() 钩子接受第二个参数 , 是一个数组 , 其中包含导致 useEffect 钩子运行的依赖项的列表 。当这些依赖项更改时 , 它将触发 Effect Hook 。如果想要只运行一次 Effect Hook , 那直接给他传递一个空数组 , 就OK啦!!
useEffect(() => {console.log('This only runs once');}, []);
这就意味着 useEffect Hook 将在第一次渲染时正常运行 。然而 , 当你的组件重新渲染时 , useEffect 会想 “好吧 , 我已经运行了 , 数组中啥也没有 , 我没啥依赖项 , 谁变都跟我没关系了 , 所以我不必再运行了 。” 然后就什么也不做了 。
总结: 空数组就意味着useEffect Hook只在挂载时运行一次当有内容更新时使用effect (就像componentDidUpdate一样)我们已经介绍了如何确保 useEffect Hook仅运行一次 , 但是当我们的组件收到新的 props 时该怎么办? 或者我们要在状态更改时运行一些代码? 其实Hooks 也能处理!
useEffect(() => {console.log("The name props has changed!") }, [props.name]);
请注意 , 这次我们如何将东西传递给useEffect数组的 , props.name 。在这种情况下 , useEffect Hook 将像往常一样在首次加载时运行 。每当您的组件从其父组件收到新的props.name时 , 都会触发useEffect Hook , 并且运行其中的代码 。
我们也可以使用状态变量来做同样的事情:
const [name, setName] = useState("Chris"); useEffect(() => {console.log("The name state variable has changed!"); }, [name]);
每当name发生变化时 , 组件就会重新渲染 , useEffect Hook 就会运行并输出消息 。而且因为这是一个数组 , 我们其实可以向它添加多个东西:const [name, setName] = useState("Chris"); useEffect(() => {console.log("Something has changed!"); }, [name, props.name]);
这样 , 当 name 状态变量更改或 props.name 更改时 , useEffect Hook 都将运行并显示控制台消息 。那我们能用componentWillUnmount吗?想要在组件即将卸载时运行一个Hook , 我们只需从useEffect Hook 返回一个函数
useEffect(() => {console.log('running effect');return () => {console.log('unmounting');};});
那我们可以多个不同的 Hooks 一起使用吗?当然! 你可以在组件中使用任意数量的Hooks , 并根据需要混合使用function App = () => {const [name, setName] = useState();const [age, setAge] = useState();useEffect(()=>{console.log("component has changed");}, [name, age])return(<div>Some jsx here...<div>)}
小结- 接下来干啥呢?你这不已经学会React Hooks了么 , Hooks允许我们使用老式的JavaScript函数来创建更简单的React组件 , 并减少大量代码 。接下来 , 手不痒痒么?当然是自己赶紧动手拿Hooks做项目体验去啊!
【给新手看的 React Hooks 教程】
推荐阅读
- 32GB内存有必要吗?实测给出你想不到的答案
- 新手使用mac电脑教程?mac电脑新手入门教程?
- 梦见借钱给别人是什么预兆借 男人梦见借钱给别人是什么预兆
- 梦见领导给自己涨工资 梦到领导说要涨工资是什么预兆
- 给家人杯好茶,如何泡出杯好茶
- 梦见自己布施食物给别人 梦见施舍饭给别人吃
- 整理下公司内部MySQL使用规范,分享给大家
- 网站被黑?给你推荐几个常用的网站木马查杀工具
- 要给五脏及时排毒 教你穴位按摩排毒法
- 刹车|“踩刹车”还前进 连人带车冲进河里!车主:特斯拉请给我个解释