ReactJS продолжает запрашивать ключ: Предупреждение: каждый дочерний элемент в списке должен иметь уникальную «ключевую» опору. Проверьте метод рендеринга PostCard.

Я не знаю, почему реакция продолжает просить ключ, даже когда ключ добавлен.

У меня есть компонент, который отображает некоторые сообщения, но каждое сообщение отображается в собственном компоненте, и он находится внутри компонента, который поступает от Swiper

мой компонент выглядит так:

      export default function Posts() {

const postsCards = posts.map(post => {
   return <SwiperSlide className="w-25" key={post._id}>
              <PostCard post={post} key={post._id}/>
          </SwiperSlide>
})

return (
<div className="container">
    <h4>Top posts</h4>
    <Swiper
      slidesPerView= 'auto'
      spaceBetween= {10}
      observer= {true}
      observeParents={true}
    >
        {postsCards}
    </Swiper>
</div>
)
}

4 ответа

Как я вижу, у вас есть один и тот же ключ для SwiperSlide и для открытки тоже. У вас должен быть уникальный ключ для каждого из них.

Как упомянул user9779830

SwiperSlide и PostCard имеют одинаковый ключ. Я создал решение, в котором ключ компонента PostCard установлен на хэш post._id:

      hashCode = s => s.split('').reduce((a,b)=>{a=((a<<5)-a)+b.charCodeAt(0);return a&a},0)

export default function Posts() {

const postsCards = posts.map(post => {
   return <SwiperSlide className="w-25" key={post._id}>
              <PostCard post={post} key={hashCode(post._id.toString())}/>
          </SwiperSlide>
})

return (
<div className="container">
    <h4>Top posts</h4>
    <Swiper
      slidesPerView= 'auto'
      spaceBetween= {10}
      observer= {true}
      observeParents={true}
    >
        {postsCards}
    </Swiper>
</div>
)
}

Как видите, ключи для обоих компонентов будут разными, поскольку компонент PostCard использует хэш post._id.

Это не совсем решение, но использование индекса в качестве ключа на данный момент позволяет определить, является ли ваш post._id уникальным.

      const postsCards = posts.map((post, index) => {
   return <SwiperSlide className="w-25" key={`${post._id}-${index}`}>
              <PostCard post={post}/>
          </SwiperSlide>
})

Если он больше не возвращает ошибку с приведенными выше кодами, вероятно, вы дублировали posts в вашем массиве сообщений.

Достаточно добавить ключевой атрибут только к родительскому компоненту SwiperSlide.

Другие вопросы по тегам