10

Понимание уникальных ключей для дочерних массивов в React.js

10

Я разрабатываю компонент на React, который принимает в качестве входных данных JSON и создает сортируемую таблицу. Каждая динамическая строка данных имеет уникальный ключ, но я все равно получаю ошибку:

Каждый дочерний элемент в массиве должен иметь уникальный пропс "key".
Проверьте метод render компонента TableComponent.

Мой метод render компонента <TableComponent> возвращает следующее:

<table>
  <thead key="thead">
    <TableHeader columns={columnNames}/>
  </thead>
  <tbody key="tbody">
    { rows }
  </tbody>
</table>

Компонент <TableHeader> представляет собой одну строку и также имеет уникальный ключ, назначенный ему.

Каждый <row> в rows создается из компонента с уникальным ключом:

<TableRowItem key={item.id} data={item} columns={columnNames}/>

Компонент <TableRowItem> выглядит так:

var TableRowItem = React.createClass({
  render: function() {
    var td = function() {
      return this.props.columns.map(function(c) {
        return <td key={this.props.data[c]}>{this.props.data[c]}</td>;
      }, this);
    }.bind(this);

    return (
      <tr>{ td(this.props.item) }</tr>
    )
  }
});

Что вызывает ошибку уникального ключа?

5 ответ(ов)

0

Это может быть полезно кому-то, но, возможно, это будет быстрая справка. Также это похоже на все ответы, представленные выше.

У меня есть много местоположений, которые генерируют список, используя структуру ниже:

return (
    {myList.map(item => (
       <>
          <div class="some class"> 
             {item.someProperty} 
              ....
          </div>
       </>
     ))}
 )

После некоторых проб и ошибок (и немного разочарований) добавление свойства key к внешнему блоку решило проблему. Также обратите внимание, что тег <> теперь заменен на тег <div>.

return (
    {myList.map((item, index) => (
       <div key={index}>
          <div class="some class"> 
             {item.someProperty} 
              ....
          </div>
       </div>
     ))}
 )

Конечно, в этом примере я наивно использовал индекс итерации (index) для заполнения значения ключа. В идеале следует использовать что-то уникальное для элемента списка.

0

Проверьте: значение ключа = undefined!!!

Вы также получили предупреждение:

Каждый элемент в списке должен иметь уникальное свойство "key".

Если ваш код выглядит правильно, убедитесь, что в строке

<ObjectRow key={someValue} />

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

0

В данном примере, чтобы добавить уникальный ключ к компонентам, вы можете использовать свойство id объекта marker, а не data.id. Предположим, что каждый объект в массиве data содержит уникальное свойство id, вы должны модифицировать ваш код следующим образом:

data.map((marker) => {
    return (
        <YourComponents 
            key={marker.id}     // <----- уникальный ключ
        />
    );
})

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

0

Предупреждение: каждое дочернее элемент в массиве или итераторе должно иметь уникальное свойство "key".

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

Лучший способ решить эту проблему — предоставить уникальный ключ для элементов массива, которые вы будете итерировать. Например:

class UsersState extends Component {
    state = {
        users: [
            {name: "shashank", age: 20},
            {name: "vardan", age: 30},
            {name: "somya", age: 40}
        ]
    }
    
    render() {
        return (
            <div>
                {
                    this.state.users.map((user, index) => {
                        return <UserState key={index} age={user.age}>{user.name}</UserState>
                    })
                }
            </div>
        )
    }
}

Обратите внимание, что index — это встроенное свойство в React, но использовать его в качестве ключа не всегда рекомендуется, так как при изменении порядка элементов это может привести к проблемам с производительностью и обновлением состояния. Лучше использовать уникальные идентификаторы, если они есть у ваших данных.

0

Лучшее решение для определения уникального ключа в React заключается в том, чтобы внутри метода map инициализировать объект, например, post, а затем устанавливать ключ с помощью key={post.id}. В вашем коде вы использовали имя item, и ключ задан так: key={item.id}.

Пример кода выглядит следующим образом:

<div className="container">
    {posts.map(item => (
        <div className="card border-primary mb-3" key={item.id}>
            <div className="card-header">{item.name}</div>
            <div className="card-body">
                <h4 className="card-title">{item.username}</h4>
                <p className="card-text">{item.email}</p>
            </div>
        </div>
    ))}
</div>

Основная идея заключается в том, что каждый элемент списка должен иметь уникальный ключ, чтобы React мог оптимально обновлять и рендерить компоненты. Убедитесь, что идентификатор (в этом случае item.id) действительно уникален для каждого элемента в массиве posts.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь