برنامه نویسی

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

در این وبلاگ به موارد زیر خواهیم پرداخت:

  • چرا الف است کلید در React مورد نیاز است؟
  • چرا از استفاده از شاخص به عنوان یک کلید اجتناب می کنیم؟
  • چگونه استفاده از شاخص به عنوان کلید مشکل ایجاد می کند؟

این مثال را در نظر بگیرید که در آن ما لیستی از دسته بندی محصولات مانند زیبایی، عطر، مبلمان و غیره داریم. هنگامی که یک دسته انتخاب می شود، جزئیات محصول آن دسته را با استفاده از داده های dummyjson نمایش می دهیم.

React:Category List مثال

کد:

// 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}

{product.title}
); })}
); }; export default CategoryContainer;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در دسته بندی کانتینر، دو لیست را مرور می کنیم: یکی برای دسته ها و دیگری برای جزئیات محصول دسته انتخابی. در ابتدا از ایندکس به عنوان کلید هر دو حلقه استفاده کردیم. همانطور که در این تصویر نشان داده شده است، این باعث بروز مشکلاتی شد که در آن تصاویر هنگام تغییر دسته ها به درستی به روز نمی شدند

واکنش: مشکل تصویر به دلیل کلید

اشکال زدایی مشکل
هنگام تغییر دسته‌ها، محتوا بلافاصله به‌روزرسانی می‌شد، اما بارگیری تصاویر مدتی طول کشید. این نشان می‌دهد که React کامپوننت‌ها را به درستی رندر نمی‌کند.

با بررسی کد متوجه شدیم که استفاده از ایندکس به عنوان کلید مانع از تشخیص React می شود که اجزای جدید باید ارائه شوند. React در حال استفاده مجدد از اجزای با تصاویر قدیمی بود که منجر به تاخیر شد

راه حل
ما نیاز داشتیم برای هر محصول یک کلید منحصر به فرد ارائه دهیم. خوشبختانه، پاسخ API شامل یک شناسه منحصر به فرد برای هر محصول بود:

واکنش نشان دهید: راه حل اینجاست

استفاده از product.id به عنوان کلید مشکل را حل کرد و مطمئن شد که React به درستی اجزای جدید را شناسایی و ارائه کرده است:

نتیجه
در React همیشه به جای ایندکس از یک شناسه منحصر به فرد برای کلیدها استفاده کنید. این کار رندر مجدد کارآمد و صحیح مؤلفه ها را تضمین می کند و از مشکلاتی مانند به روز رسانی تاخیری تصویر یا وضعیت های نادرست مؤلفه جلوگیری می کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا