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

React中SearchBar组件列表渲染时key属性报错问题求助

React中SearchBar组件列表渲染时key属性报错问题求助

我仔细看了你的代码,找到导致key属性报错的原因了!

你当前在map循环里返回的是空Fragment(<>...</>),虽然你给里面的div加了key={item._id},但React要求key必须绑定在map返回的最顶层元素上——这里的空Fragment才是每个循环项的根元素,而空Fragment本身不支持设置key属性,所以你给内层div加的key对React的diff算法来说是无效的,自然会一直提示key缺失的错误。

两种解决办法:

办法1:移除不必要的空Fragment

因为你当前的Fragment里只包裹了一个div,完全可以直接返回这个div,把key保留在div上(你已经写了key={item._id},只要去掉外层Fragment即可):

{divisVisible && (
  <div className="absolute bg-[#ffffff] text-gray-700 w-[300px] h-auto py-3 px-3 rounded-lg mt-2 z-20 border-black border-2 border-solid ">
    {data && data.length > 0 ? (
      data?.map((item: any) => {
        return (
          <div
            className="py-2 cursor-pointer hover:bg-[#0000ffbe] hover:text-white hover:rounded-lg px-2"
            key={item._id}>
            <div
              onClick={() => {
                router.push(`/allproducts/${item._id}`);
                setInput("");
              }}>
              {item.title}
            </div>
          </div>
        );
      })
    ) : (
      <>
        {" "}
        <div className="py-1 cursor-pointer  px-2">
          No result found...
        </div>
      </>
    )}
  </div>
)}

办法2:如果需要保留Fragment(比如后续要添加多个同级元素)

不要用空的<>...</>,改用完整的React.Fragment并给它设置key:

{divisVisible && (
  <div className="absolute bg-[#ffffff] text-gray-700 w-[300px] h-auto py-3 px-3 rounded-lg mt-2 z-20 border-black border-2 border-solid ">
    {data && data.length > 0 ? (
      data?.map((item: any) => {
        return (
          <React.Fragment key={item._id}>
            <div
              className="py-2 cursor-pointer hover:bg-[#0000ffbe] hover:text-white hover:rounded-lg px-2">
              <div
                onClick={() => {
                  router.push(`/allproducts/${item._id}`);
                  setInput("");
                }}>
                {item.title}
              </div>
            </div>
          </React.Fragment>
        );
      })
    ) : (
      <>
        {" "}
        <div className="py-1 cursor-pointer  px-2">
          No result found...
        </div>
      </>
    )}
  </div>
)}

关键说明:

React的diff算法通过key来跟踪列表中每个元素的身份,key必须是列表项的唯一标识(你用item._id是完全正确的),而且必须直接绑定在map返回的最外层元素上,这样React才能正确识别每个列表项的变化,避免报错。

按照上面的修改调整后,key的位置就符合React的要求了,报错应该就会消失啦。

备注:内容来源于stack exchange,提问作者fullstack-purbayan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:12:59