1、介绍
useEffect是hooks中又一个重要的函数,Effect hooks容许你在组件外部中执行副作用操作。
副作用包含:
- 数据获取
- 设置订阅
- 手动更改DOM等等
useEffect就是为了解决这些副作用而被发明进去的函数,它相当于class中componentDidMount,componentDidUpdate 和 componentWillUnmount 这三个函数的组合。
2、用法
useEffect(()=>{},[])
useEffect 有两个参数。第一个参数是Effect,第二个参数是依赖值列表。
组件的每一次渲染都会产生一个新的Effect,这个Effect每一次渲染拿到的prop和state是不同的。
第二次参数是依赖值列表。
- 当不传递的时候,useEffect会在每次渲染实现后执行
- 当传递一个[]的时候,那么useEffect只会在挂载的时候执行(如果useEffect返回了一个函数,那么这个函数会在组件卸载的时候执行)
- 当传递一个值的时候,如[a],那么useEffect就会依据这个值是否发生变化,来判断是否去执行useEffect函数
- 当传递多个值的时候,如[a,b,c…],那么他就是会比拟每一个值,有一个不雷同就回去执行
3、两种副作用
在React中有两种常见的副作用操作:须要被革除和不须要被革除的。
无需革除的副作用:
有时候,咱们只想在React和更新DOM操作之后运行一些额定的代码。比如说,发送网络申请、手动变更DOM、记录日志,这些都是常见的无需革除副作用的操作。因为咱们在执行完这些操作之后,就能够疏忽他们了。
import React, { useState, useEffect } from 'react';function Example() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> );}
组件加载和更新时的时候,都会执行设置了一次document.title。
须要革除的副作用
订阅内部的数据源,这种状况下,革除副作用是非常重要的,能够避免内存泄露。
import React, { useState, useEffect } from 'react'; function FriendStatus(props) { const [isOnline, setIsOnline] = useState(null); useEffect(() => { function handleStatusChange(status) { setIsOnline(status.isOnline); } ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); // Specify how to clean up after this effect: return function cleanup() { ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); }; }); if (isOnline === null) { return 'Loading...'; } return isOnline ? 'Online' : 'Offline';}