📅  最后修改于: 2023-12-03 15:35:32.360000             🧑  作者: Mango
在 React 中,我们想要在组件渲染后执行一些操作(例如:请求数据、添加事件监听器等等),就可以使用 useEffect
钩子函数。
import { useEffect } from 'react';
function Example() {
useEffect(() => {
// 在这里执行副作用操作
// 返回一个清理函数
return () => {
// 在这里执行清理操作
}
}, []); // 依赖项数组
return (
<div>Example</div>
);
}
[...]
:当数组中的值发生变化时,函数会再次执行。如果这个数组为空,函数仅在组件渲染时执行一次。当组件渲染时,我们可以使用 useEffect
钩子来执行 AJAX 请求,如下所示:
import { useEffect, useState } from 'react';
import axios from 'axios';
function Example() {
const [data, setData] = useState([]);
useEffect(() => {
async function fetchData() {
const result = await axios('https://jsonplaceholder.typicode.com/todos');
setData(result.data);
}
fetchData();
}, []);
return (
<ul>
{data.map(item => (
<li key={item.id}>{item.title}</li>
))}
</ul>
);
}
在这个例子中,我们使用了 useState
钩子来在组件中存储 data
。然后再使用 useEffect
钩子发送 AJAX 请求并设置状态。
当组件销毁时,我们应该清理事件监听器以避免内存泄漏。我们可以使用 useEffect
钩子来添加事件监听器并返回一个清理函数,如下所示:
import { useState, useEffect } from 'react';
function Example() {
const [windowSize, setWindowSize] = useState(window.innerWidth);
useEffect(() => {
function handleResize() {
setWindowSize(window.innerWidth);
}
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
return (
<div>Window size: {windowSize}</div>
);
}
在这个例子中,我们使用 useState
钩子来保存窗口的宽度。然后使用 useEffect
钩子添加一个事件监听器,为 resize
事件设置 handleResize
回调函数,并在组件卸载时清理事件监听器。
当我们订阅数据时,我们应该在组件销毁时取消订阅以避免内存泄漏。我们可以使用 useEffect
钩子来订阅数据并返回一个清理函数,如下所示:
import { useState, useEffect } from 'react';
function Example() {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromStatus(props.friend.id, handleStatusChange);
};
}, [props.friend.id]);
if (isOnline === null) {
return 'Loading...';
}
return (
<div>Status: {isOnline ? 'Online' : 'Offline'}</div>
);
}
在这个例子中,我们使用 useState
钩子来保存 isOnline
状态。然后我们使用 useEffect
钩子订阅 props.friend.id
。然后在组件销毁时返回一个清理函数。在 useEffect
钩子中声明函数时,我们必须在依赖项数组中传入 props.friend.id
,以确保订阅和取消订阅只在 props.friend.id
改变时被调用。
useEffect
钩子可以使得执行有副作用操作变得简单易行。无论是请求数据、添加事件监听器还是订阅数据,useEffect
都是处理这些任务的理想选择。记住在使用 useEffect
钩子时需要遵循以下指导原则:
async
函数中,并确保它们是可取消的。this.setState
)。