实现方案
- 在父组件中管理状态:使用
useState
钩子来管理数据加载状态(loading)、错误状态(error)以及用户信息数据(userData)。
- 异步获取数据:在
useEffect
钩子中调用异步API获取用户信息数据,在获取数据过程中更新加载状态,获取成功时更新用户信息数据,获取失败时更新错误状态。
- 传递数据与状态到子组件:将加载状态、错误状态以及用户信息数据传递给子组件。
- 子组件处理数据:子组件根据传递过来的状态进行相应处理,在数据加载时显示加载提示,数据获取失败时显示错误提示,数据加载成功时显示用户信息。
- 性能优化:使用
React.memo
包裹子组件,避免在数据未发生变化时重复渲染。
核心代码
import React, { useState, useEffect } from'react';
// 子组件,使用React.memo进行性能优化
const UserInfoComponent = React.memo(({ userData, loading, error }) => {
if (loading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error.message}</div>;
}
return (
<div>
<p>Name: {userData.name}</p>
<p>Email: {userData.email}</p>
{/* 显示其他用户信息 */}
</div>
);
});
const ParentComponent = () => {
const [userData, setUserData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
const fetchUserData = async () => {
setLoading(true);
try {
const response = await fetch('/api/user');
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
setUserData(data);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchUserData();
}, []);
return (
<div>
<UserInfoComponent userData={userData} loading={loading} error={error} />
</div>
);
};
export default ParentComponent;