2026-04-02 03:08:07
在React开发中,当渲染列表时经常会遇到“Each child in a list should have a unique "key" prop”警告。理解并正确使用key属性对于优化列表渲染性能和避免UI问题至关重要。
React使用协调算法高效更新UI。当组件状态或props变化时,React会构建新的虚拟DOM树并与之前版本比较,找出需要更新的部分。在列表渲染中:
没有正确key的后果:
考虑以下显示加载状态的Shimmer组件代码:
const Shimmer = () => { return ( <div className="restraunt-list"> {Array(15) .fill("") .map((e) => ( <div className="shimmer-card"> </div> ))} </div> );};export default Shimmer;这段代码会触发React警告,因为没有为每个div元素指定key属性。
修改后的代码利用map方法的第二个参数(索引)作为key:
const Shimmer = () => { return ( <div className="restraunt-list"> {Array(20) .fill("") .map((e, index) => ( <div key={index} className="shimmer-card"> <img className="shimmer-image" alt="Shimmer placeholder" /> <p className="shimmer-card-heading"></p> <p className="shimmer-card-restaurant-name"></p> </div> ))} </div> );};export default Shimmer;适用场景:
对于动态数据列表,应优先使用数据项本身的稳定唯一ID:
const users = [ { id: 'a1b2c3d4', name: 'Alice' }, { id: 'e5f6g7h8', name: 'Bob' }, // ...];{users.map((user) => ( <UserCard key={user.id} user={user} />))}优势:
错误示例1:多个列表使用相同key
// 错误:两个列表使用相同key{list1.map((item) => <div key="same-key">{item.name}</div>)}{list2.map((item) => <div key="same-key">{item.name}</div>)}修正:确保每个列表项有唯一key
{list1.map((item) => <div key={`list1-${item.id}`}>{item.name}</div>)}{list2.map((item) => <div key={`list2-${item.id}`}>{item.name}</div>)}错误示例2:动态列表使用索引作为key
// 错误:当列表顺序变化时会引发问题{dynamicList.map((item, index) => <Item key={index} item={item} />)}修正:使用稳定ID作为key
{dynamicList.map((item) => <Item key={item.id} item={item} />)}正确使用key属性是React列表渲染优化的关键步骤,遵循这些原则将显著提升应用性能和用户体验。