Создать новый элемент div для каждого элемента в массиве с помощью JSX?

#javascript #html #arrays #reactjs

Вопрос:

Я пытаюсь создать элемент div для каждого элемента в массиве, используя reactjs JSX. Я не был уверен, как на самом деле это сделать, но я попытался сделать это:

 {results.forEach(element => {
               <div className={classes.SearchResults}>

                {results[element]}    

                </div>

})}
 

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

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

1. Это map не forEach

2. Map вернет новый массив, тогда как я пытаюсь создать новый элемент div для каждого элемента в массиве. Не могли бы вы подробнее объяснить, почему это неправильно?

Ответ №1:

Закрыть.

Во-первых, вы хотите .map() , а не .forEach() . Последний просто выполняет итерацию, но ничего не возвращает, тогда как первый возвращает новый массив (того же размера, что и исходный), «сопоставленный» с новой структурой элементов (в данном случае элементов JSX).


Помимо этого… Использование фигурных скобок {} здесь создает тело функции, которое в данном случае состоит из элемента JSX, но ничего не возвращает:

 {
  <div className={classes.SearchResults}>
    {results[element]}    
  </div>
}
 

Вы можете вернуть элемент явно:

 {
  return (<div className={classes.SearchResults}>
    {results[element]}    
  </div>);
}
 

Или используйте неявный возврат из функции arrow, используя круглые скобки () вокруг него, чтобы вся функция была только одним оператором (вместо явного тела функции):

 (
  <div className={classes.SearchResults}>
    {results[element]}    
  </div>
)
 

Дополнительно…Использование results[element] здесь выглядит неправильно. Первым аргументом обратного .map() вызова является не индекс, а сам элемент. Я подозреваю, что вы этого хотите:

 (
  <div className={classes.SearchResults}>
    {element}    
  </div>
)
 

В качестве последнего замечания, в React вы увидите предупреждения, если вы выполняете итерацию по такому массиву, чтобы создать JSX, но не предоставляете key свойство элементу JSX. Если у element объекта есть идентификатор, такой как id свойство, вы можете использовать это:

 (
  <div key={element.id} className={classes.SearchResults}>
    {element}    
  </div>
)
 

Но в противном случае вы всегда можете положиться на второй аргумент .map() обратного вызова, который является просто индексом элемента массива:

 {results.map((element, i) => (
  <div key={i} className={classes.SearchResults}>
    {element}    
  </div>
))}
 

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

1. Это полностью решило мою проблему. Очень глубокий и понятный. Я действительно ценю это 🙂

Ответ №2:

Вы близки, но здесь вы используете неправильный метод массива. Array.map() возвращает новый массив, и вы можете использовать его для возврата массива divs для рендеринга для каждого элемента в results массиве.

Для получения более подробной информации посмотрите здесь: https://reactjs.org/docs/lists-and-keys.html

Ответ №3:

forEach просто запускает обратный вызов, игнорируя возвращаемое значение

map используется для преобразования и возврата нового значения для каждой итерации, поэтому вместо этого вы можете использовать следующее:

 {results.map((element, index) => {
   return (
      <div className={classes.SearchResults} key={index}>
          {results[element]}    
      </div>
   )
})}