You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Tailwind动态网格布局与唯一Key错误排查求助

问题:React网格布局动态列起始位置无效+唯一Key错误
  • 在12列网格中仅使用中间6列(左右各留3列留白),3个各占2列的元素需分别从第4、6、8列开始排列,但动态设置col-start-${variable}不生效
  • 同时遇到React唯一key错误,尝试多种方案未解决

相关代码

Header.jsx

import React from "react";
import contact from "../data/contact";

function Header() {
    return (
        <section>
            <h1 className="text-5xl font-medium">
                Title
            </h1>
            <div className="grid grid-cols-12">
                {contact.map((item, index) => (
                    <div key={item.key} id={item.key} className={`col-start-${index*(index+1)+4}`}>
                        <div className="flex flex-row bg-white p-3 font-bold border border-1">
                            {item.svg}
                            <h1 className="self-center pl-3">{item.title}</h1>
                        </div>
                    </div>
                ))}
            </div>
        </section>
    );
}

export default Header;

contact.js

const contact = [
    // Phone
    {
        key: "phoneSVG",
        svg: [
            <svg
                xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 24 24"
                fill="black"
                className="w-8 h-8"
            >
                <path
                    fillRule="evenodd"
                    d="M1.5 4.5a3 3 0 013-3h1.372c.86 0 1.61.586 1.819 1.42l1.105 4.423a1.875 1.875 0 01-.694 1.955l-1.293.97c-.135.101-.164.249-.126.352a11.285 11.285 0 006.697 6.697c.103.038.25.009.352-.126l.97-1.293a1.875 1.875 0 011.955-.694l4.423 1.105c.834.209 1.42.959 1.42 1.82V19.5a3 3 0 01-3 3h-2.25C8.552 22.5 1.5 15.448 1.5 6.75V4.5z"
                    clipRule="evenodd"
                />
            </svg>,
        ],
        title: "Phone",
    },

    // Mail
    {
        key: "mailSVG",
        svg: [
            <svg
                xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 24 24"
                fill="black"
                className="w-8 h-8"
            >
                <path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z" />
                <path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z" />
            </svg>,
        ],
        title: "Email",
    },

    // Download
    {
        key: "downloadSVG",
        svg: [
            <svg
                xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 24 24"
                fill="black"
                className="w-8 h-8"
            >
                <path
                    fillRule="evenodd"
                    d="M19.5 21a3 3 0 003-3V9a3 3 0 00-3-3h-5.379a.75.75 0 01-.53-.22L11.47 3.66A2.25 2.25 0 009.879 3H4.5a3 3 0 00-3 3v12a3 3 0 003 3h15zm-6.75-10.5a.75.75 0 00-1.5 0v4.19l-1.72-1.72a.75.75 0 00-1.06 1.06l3 3a.75.75 0 001.06 0l3-3a.75.75 0 10-1.06-1.06l-1.72 1.72V10.5z"
                    clipRule="evenodd"
                />
            </svg>,
        ],
        title: "Download CV",
    },
];

export default contact;

解决方案

1. 修复动态列起始位置问题

原计算式index*(index+1)+4逻辑错误:当index为0、1、2时,计算结果分别为4、6、10,不符合需求的4、6、8。直接用4 + index*2即可得到正确的起始列,同时需添加col-span-2确保每个元素占2列:

className={`col-start-${4 + index*2} col-span-2`}

2. 解决React唯一Key错误

item.key本身是唯一的,错误根源在于每个item.svg是数组形式,React渲染数组元素必须指定唯一key。最简单的修复方式是去掉svg的数组包裹(因为每个item仅包含一个svg):

修正后的完整代码

Header.jsx

import React from "react";
import contact from "../data/contact";

function Header() {
    return (
        <section>
            <h1 className="text-5xl font-medium">
                Title
            </h1>
            <div className="grid grid-cols-12">
                {contact.map((item, index) => (
                    <div key={item.key} id={item.key} className={`col-start-${4 + index*2} col-span-2`}>
                        <div className="flex flex-row bg-white p-3 font-bold border border-1">
                            {item.svg}
                            <h1 className="self-center pl-3">{item.title}</h1>
                        </div>
                    </div>
                ))}
            </div>
        </section>
    );
}

export default Header;

contact.js

const contact = [
    // Phone
    {
        key: "phoneSVG",
        svg: (
            <svg
                xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 24 24"
                fill="black"
                className="w-8 h-8"
            >
                <path
                    fillRule="evenodd"
                    d="M1.5 4.5a3 3 0 013-3h1.372c.86 0 1.61.586 1.819 1.42l1.105 4.423a1.875 1.875 0 01-.694 1.955l-1.293.97c-.135.101-.164.249-.126.352a11.285 11.285 0 006.697 6.697c.103.038.25.009.352-.126l.97-1.293a1.875 1.875 0 011.955-.694l4.423 1.105c.834.209 1.42.959 1.42 1.82V19.5a3 3 0 01-3 3h-2.25C8.552 22.5 1.5 15.448 1.5 6.75V4.5z"
                    clipRule="evenodd"
                />
            </svg>
        ),
        title: "Phone",
    },

    // Mail
    {
        key: "mailSVG",
        svg: (
            <svg
                xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 24 24"
                fill="black"
                className="w-8 h-8"
            >
                <path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z" />
                <path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z" />
            </svg>
        ),
        title: "Email",
    },

    // Download
    {
        key: "downloadSVG",
        svg: (
            <svg
                xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 24 24"
                fill="black"
                className="w-8 h-8"
            >
                <path
                    fillRule="evenodd"
                    d="M19.5 21a3 3 0 003-3V9a3 3 0 00-3-3h-5.379a.75.75 0 01-.53-.22L11.47 3.66A2.25 2.25 0 009.879 3H4.5a3 3 0 00-3 3v12a3 3 0 003 3h15zm-6.75-10.5a.75.75 0 00-1.5 0v4.19l-1.72-1.72a.75.75 0 00-1.06 1.06l3 3a.75.75 0 001.06 0l3-3a.75.75 0 10-1.06-1.06l-1.72 1.72V10.5z"
                    clipRule="evenodd"
                />
            </svg>
        ),
        title: "Download CV",
    },
];

export default contact;

内容的提问来源于stack exchange,提问作者jNiuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:50:24