واکنش نشان دهید: خطرات پنهان استفاده از شاخص به عنوان یک کلید

در این وبلاگ به موارد زیر خواهیم پرداخت:
- چرا الف است کلید در React مورد نیاز است؟
- چرا از استفاده از شاخص به عنوان یک کلید اجتناب می کنیم؟
- چگونه استفاده از شاخص به عنوان کلید مشکل ایجاد می کند؟
این مثال را در نظر بگیرید که در آن ما لیستی از دسته بندی محصولات مانند زیبایی، عطر، مبلمان و غیره داریم. هنگامی که یک دسته انتخاب می شود، جزئیات محصول آن دسته را با استفاده از داده های dummyjson نمایش می دهیم.
کد:
// src/app/page.tsx
import CategoryContainer from "@/components/home-container";
import "../styles/global.css";
export default async function Home() {
const response = await fetch("https://dummyjson.com/products/category-list");
const data: string[] = await response.json();
return (
<>
>
);
}
// CategoryContainer.tsx
"use client";
import Image from "next/image";
import React, { FC, useEffect, useState } from "react";
import ProductResponse from "./from-type-folder-lets-assume";
type Props = {
data: string[];
};
const CategoryContainer: FC = ({ data }) => {
const [selectedCategory, setSelectedCategory] = useState("");
const [productDetails, setProductDetails] = useState(
null
);
useEffect(() => {
(async () => {
const response = await fetch(
"https://dummyjson.com/products/category/" + selectedCategory
);
const data: ProductResponse = await response.json();
setProductDetails(data);
})();
}, [selectedCategory]);
return (
{data?.map((item, index) => {
return (
);
})}
{productDetails?.products?.map((product, index) => {
return (
{product.title}
{product.description}
);
})}
);
};
export default CategoryContainer;
در دسته بندی کانتینر، دو لیست را مرور می کنیم: یکی برای دسته ها و دیگری برای جزئیات محصول دسته انتخابی. در ابتدا از ایندکس به عنوان کلید هر دو حلقه استفاده کردیم. همانطور که در این تصویر نشان داده شده است، این باعث بروز مشکلاتی شد که در آن تصاویر هنگام تغییر دسته ها به درستی به روز نمی شدند
اشکال زدایی مشکل
هنگام تغییر دستهها، محتوا بلافاصله بهروزرسانی میشد، اما بارگیری تصاویر مدتی طول کشید. این نشان میدهد که React کامپوننتها را به درستی رندر نمیکند.
با بررسی کد متوجه شدیم که استفاده از ایندکس به عنوان کلید مانع از تشخیص React می شود که اجزای جدید باید ارائه شوند. React در حال استفاده مجدد از اجزای با تصاویر قدیمی بود که منجر به تاخیر شد
راه حل
ما نیاز داشتیم برای هر محصول یک کلید منحصر به فرد ارائه دهیم. خوشبختانه، پاسخ API شامل یک شناسه منحصر به فرد برای هر محصول بود:
استفاده از product.id به عنوان کلید مشکل را حل کرد و مطمئن شد که React به درستی اجزای جدید را شناسایی و ارائه کرده است:
نتیجه
در React همیشه به جای ایندکس از یک شناسه منحصر به فرد برای کلیدها استفاده کنید. این کار رندر مجدد کارآمد و صحیح مؤلفه ها را تضمین می کند و از مشکلاتی مانند به روز رسانی تاخیری تصویر یا وضعیت های نادرست مؤلفه جلوگیری می کند.