
在react中,当渲染一个列表时,例如使用map()方法遍历数组生成一组组件或html元素时,react会要求你为列表中的每个子元素提供一个名为key的特殊字符串属性。这个key属性在兄弟节点之间必须是唯一的。
key属性的作用主要体现在React的协调(Reconciliation)算法中。当列表中的元素发生变化(例如,新增、删除、重新排序)时,React会利用key来高效地识别哪些项发生了改变,从而最小化DOM操作,提高更新性能。
如果没有key,或者key不唯一,React将无法准确追踪每个列表项的状态,可能导致以下问题:
考虑一个常见的场景:我们希望在数据加载完成之前显示一个“闪烁”的加载效果(Shimmer effect),通常由多个重复的占位符组成。以下是一个典型的错误示例,它会导致React发出key属性缺失的警告:
// Shimmer.jsx (问题代码)
const Shimmer = () => {
return (
<div className="restraunt-list">
{Array(15) // 创建一个包含15个空字符串的数组
.fill("")
.map((e) => (
<div className="shimmer-card"> </div> // 每个div都没有key属性
))}
</div>
);
};
export default Shimmer;当这段代码被渲染时,控制台会输出以下警告:
index.js:1 Warning: Each child in a list should have a unique "key" prop.
Check the render method of `Shimmer`. See https://reactjs.org/link/warning-keys for more information.
at div
at Shimmer
at Body
at AppLayout这个警告明确指出,在Shimmer组件的渲染方法中,列表中的每个div子元素都缺少一个唯一的key属性。
对于像Shimmer效果这样,列表项本身没有稳定唯一ID,且列表内容不会发生顺序变化、增删操作的静态列表,可以使用数组的index作为key。map方法的第二个参数就是当前元素的索引。
以下是修复后的代码示例:
// Shimmer.jsx (修正后的代码)
const Shimmer = () => {
return (
<div className="restraunt-list">
{Array(20) // 假设需要显示20个Shimmer卡片
.fill("")
.map((e, index) => ( // 使用map方法的第二个参数index作为key
<div key={index} className="shimmer-card"> {/* 添加了key={index} */}
<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;通过将key={index}添加到shimmer-card的div元素上,我们为每个Shimmer卡片提供了一个唯一的标识符,从而消除了React的警告。
虽然使用index作为key可以解决警告,但在大多数情况下,这不是最佳实践。只有当以下三个条件都满足时,才适合使用index作为key:
在Shimmer加载效果的场景中,这些条件通常是满足的:Shimmer卡片的数量是固定的,它们的顺序不会改变,也没有复杂的内部状态需要维护。因此,使用index作为key是可接受的。
在实际开发中,当处理来自后端API的数据列表时,始终优先使用数据项中稳定且唯一的ID作为key。例如,如果你的餐厅数据包含一个id字段:
const restaurants = [
{ id: '101', name: '餐厅A', cuisine: '中餐' },
{ id: '102', name: '餐厅B', cuisine: '西餐' },
// ...
];那么,正确的做法是:
{restaurants.map((restaurant) => (
<RestaurantCard key={restaurant.id} data={restaurant} />
))}为React列表中的每个子元素提供一个唯一的key属性是至关重要的。它不仅能够消除开发模式下的警告,更能显著优化React的渲染性能和状态管理。对于Shimmer加载效果这类静态、无序变化的列表,使用index作为key是一种可接受且简便的解决方案。然而,在处理动态数据列表时,始终优先使用数据本身提供的稳定、唯一ID作为key,以确保应用程序的健壮性和高性能。
以上就是React列表渲染:为Shimmer卡片子元素提供唯一key的实践与原理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号