#处理数据加载和空状态渲染
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| import { useState, useEffect } from 'react';
const DataComponent = () => { const [data, setData] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null);
useEffect(() => { const fetchData = async () => { try { const response = await fetch('https://api.example.com/data'); if (!response.ok) throw new Error('请求失败'); const result = await response.json(); setData(result); } catch (err) { setError(err.message); } finally { setIsLoading(false); } };
fetchData(); }, []);
if (isLoading) { return <div className="loading-spinner">加载中...</div>; }
if (error) { return <div className="error-message">错误:{error}</div>; }
if (!data || (Array.isArray(data) && data.length === 0)) { return <div className="empty-state">暂无数据</div>; }
return ( <div className="data-list"> {data.map(item => ( <div key={item.id} className="data-item"> {item.name} </div> ))} </div> ); };
export default DataComponent;
|
关键点解析:
状态管理:
生命周期控制:
条件渲染优先级:
加载状态优先显示
错误状态次优先
空数据状态检查
最终数据渲染
空数据判断优化: ================
优化方案
在 useEffect
中 添加请求取消逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| useEffect(() => { const abortController = new AbortController();
const fetchData = async () => { try { const response = await fetch('https://api.example.com/data', { signal: abortController.signal }); } catch (err) { if (err.name !== 'AbortError') { } } };
fetchData();
return () => abortController.abort(); }, []);
|
#List防空渲染
1 2 3 4 5 6 7 8 9 10 11
| {Array.isArray(labelList) && labelList.length > 0 ? ( labelList.map((label) => ( <h3 className='p-1 hover:rounded-md hover:bg-[#262626] cursor-pointer' key={label.id} onClick={() => console.log(label.id)} >{label.labelName}</h3> )) ) : ( <div className="empty w-full"></div> )}
|