方法一:使用状态变量标记请求状态
- 原理:在组件内部维护一个状态变量,用于标记数据是否已经获取过。如果已经获取过,则不再发起新的请求。
- 代码示例:
import React, { useState, useEffect } from'react';
const UserList = () => {
const [users, setUsers] = useState([]);
const [isDataFetched, setIsDataFetched] = useState(false);
useEffect(() => {
if (!isDataFetched) {
fetch('https://example.com/api/users')
.then(response => response.json())
.then(data => {
setUsers(data);
setIsDataFetched(true);
});
}
}, []);
return (
<div>
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
</div>
);
};
export default UserList;
方法二:使用 useEffect
的依赖数组优化
- 原理:通过仔细设置
useEffect
的依赖数组,确保只有在必要的时候才触发副作用(数据获取操作)。如果依赖数组为空,useEffect
只会在组件挂载时执行一次。
- 代码示例:
import React, { useState, useEffect } from'react';
const UserList = () => {
const [users, setUsers] = useState([]);
useEffect(() => {
fetch('https://example.com/api/users')
.then(response => response.json())
.then(data => setUsers(data));
}, []);
return (
<div>
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
</div>
);
};
export default UserList;
方法三:使用自定义 Hook 封装数据获取逻辑
- 原理:将数据获取逻辑封装到一个自定义 Hook 中,在自定义 Hook 内部维护请求状态,避免重复请求。
- 代码示例:
import { useState, useEffect } from'react';
const useFetchUsers = () => {
const [users, setUsers] = useState([]);
const [isDataFetched, setIsDataFetched] = useState(false);
useEffect(() => {
if (!isDataFetched) {
fetch('https://example.com/api/users')
.then(response => response.json())
.then(data => {
setUsers(data);
setIsDataFetched(true);
});
}
}, []);
return users;
};
const UserList = () => {
const users = useFetchUsers();
return (
<div>
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
</div>
);
};
export default UserList;