Уникальный ключ Реагирует, решение?

#reactjs #key

Вопрос:

Как передать ключ в этом коде?

{result.map(book, key => Я застрял здесь. Я пытался несколько раз, но у меня не получается!

           { 
             result.map(book => (
                    <div className="col-md-3 mb-5">
                        <div className="card card-body bg-light text-center h-100">
                            <img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
                            <h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
                            <h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
                            </Link>
                        </div>
                    </div>
                   ))
          }
 

Комментарии:

1. {result.map((book,index) => (<div key={index} className="col-md-3 mb-5">..... сделайте это так, чтобы это решило вашу проблему

Ответ №1:

Реагировать.Дети.toArray решает эту проблему, поскольку он берет на себя задачу присвоения ключей дочерним элементам. Сделай это вот так

 {React.Children.toArray(
result.map(book => (
                    <div className="col-md-3 mb-5">
                        <div className="card card-body bg-light text-center h-100">
                            <img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
                            <h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
                            <h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
                            </Link>
                        </div>
                    </div>

                )))}
 

Ответ №2:

Лучший способ-использовать уникальный ключ для книг (идентификатор). Это может вызвать проблемы, если вы, например, удалите книги.

Я не знаю вашей реализации API, но это может выглядеть примерно так:

  {result.map(book => (
    <div className="col-md-3 mb-5" key={book.id}>
        <div className="card card-body bg-light text-center h-100">
            <img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
            <h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
            <h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
            </Link>
        </div>
    </div>
))}
 

Ответ №3:

Свойство ключа должно быть уникальным, чтобы не нарушать правила реакции. Поэтому я предлагаю вам использовать book.id если у него есть свойство is или индекс массива с. map((book,index)=>{}) Обратите внимание, что если у вас в коде несколько карт, фактически во всем приложении, этот подход, вероятно, не сработает, так как будет больше компонентов с одним и тем же ключевым свойством.

Поэтому я предлагаю вам использовать ключ с префиксом, который предотвращает дубликаты. Например

 books.map((book, idx)=><Book key={`book_${idx}`} />)
 

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

Ответ №4:

Похоже, вам не хватает круглых скобок.

Если вы хотите использовать индекс элемента в качестве ключа, вы можете попробовать:

 {result.map((book, index) => <div key={index} ...>...</div>)}
 

Но использовать индексы для ключей не рекомендуется. Было бы лучше использовать идентификаторы из ваших данных в качестве ключей.

Подробнее об этом: Индекс как ключ является анти-шаблоном.