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';
}
发表回复