Невозможно отобразить массив значений (компонент React)

Я создаю тестовое приложение, чтобы узнать больше о React, и я сделал вызов API, который получает огромный объект JSON. Я смог разбить этот json на части, которые мне нужны, и теперь у меня есть 10 массивов по 3 реквизита в каждом. Я могу отправить эти 10 массивов в 3 реквизита другому компоненту, который должен использовать эти 3 реквизита 10 раз и визуализировать каждый из них по div class Card.

Я могу console.info(this.props), и он показывает 10 разных массивов с 3 реквизитами в каждом, однако я не могу создать один и тот же элемент 10 раз .. Я пробовал использовать map (), но поскольку мой массив изначально не определен, map () также не может работать должным образом . Есть ли что-то вроде * ngFor в Angular?

Как лучше всего это сделать?

*РЕДАКТИРОВАТЬ Вот еще код, ребята. Извините, все еще нуби здесь ..

ОШИБКА: this.props.map не является функцией

 return(
    <div>            
 {this.props.map((data,i)=>{
       return(
          <li key = {i}>{data.likes}</li>
           );

* РЕДАКТИРОВАТЬ 2 Так вот, я пробовал запустить функцию карты с условием if, но код по-прежнему ломается в тот момент, когда условие становится истинным.

render() { 
 if (this.props.url !== undefined){
     this.props.map((data,i) =>{
       return <li key = {i}>{data.likes}</li>
     })
   }

Мой метод состояния:

state = {
        userId: undefined,
        likes: undefined,
        url: undefined
    }

и я устанавливаю свои значения для каждого потока данных следующим образом:

const pics = await fetch(`${base_url}?key=${api_key}&q=${query}
            &img_type=photo&per_page=12`).then(response => {
                    return response.json();
                })

            pics.hits.map((data) =>{
                return this.setState({
                    userId: data.user_id,
                    likes: data.likes,
                    url: data.webformatURL
                })
            })

Привет! Пожалуйста, возьмите тур, осмотритесь и прочитайте центр помощи, в частности Как мне задать хороший вопрос?. Мы не можем помочь вам с кодом, который мы не видим. Обновите свой вопрос, добавив минимальный воспроизводимый пример, демонстрирующий проблему, в идеале работоспособный, используя Stack Snippets (кнопка панели инструментов [<>]). Фрагменты стека поддерживают React, включая JSX; вот как это сделать.

T.J. Crowder 15.06.2018 09:42

Вы до сих пор не показали нам, как вы настраиваете props, что действительно важно. Еще раз: обновите свой вопрос, добавив минимальный воспроизводимый пример, демонстрирующий проблему, в идеале работоспособный, используя Stack Snippets (кнопка панели инструментов [<>]). Фрагменты стека поддерживают React, включая JSX; вот как это сделать.

T.J. Crowder 15.06.2018 10:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
1 346
4

Ответы 4

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

{props && props.map ([КОД ПРЕДСТАВЛЕНИЯ ЗДЕСЬ])}

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

Другой вариант - установить defaultProps для пустого массива.

MyComponent.defaultProps = {
  arrProp: []
};

Я сделал, но это тоже не работает .. Также сначала попробовал пустую строку.

Yashank 15.06.2018 10:28

this.props не будет иметь map, это не массив. Это объект со свойством для каждого свойства, переданного вашему компоненту. Например:

<YourComponent foo = "bar"/>

... будет this.props.foo со значением "bar".

Итак, если вы передаете массив своему компоненту, например:

<YourComponent theArrayProperty = {[{likes: 42},{likes:27}]} />

... тогда вам нужно имя этого свойства:

return (
    <div>            
        {this.props.theArrayProperty.map((data,i) => {
            return (
                <li key = {i}>{data.likes}</li>
            );
        })}
    </div>
    );

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

return (
    <div>            
        {this.props.theArrayProperty.map((data,i) => <li key = {i}>{data.likes}</li>)}
    </div>
    );

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

return <div>            
        {this.props.theArrayProperty.map((data,i) => <li key = {i}>{data.likes}</li>)}
    </div>;

... но это вопрос стиля.

Да, вы правы, это была глупая ошибка, но я все еще не могу заставить эту функцию работать даже со свойством Array .. Я получаю сообщение TypeError о том, что this.props.likes.map не является функцией.

Yashank 15.06.2018 10:49

@YashankVarshney - В третий раз: обновите свой вопрос, добавив в свой вопрос минимальный воспроизводимый пример, демонстрирующий проблему, в идеале работоспособный с использованием фрагментов стека (кнопка панели инструментов [<>]). Фрагменты стека поддерживают React, включая JSX; вот как это сделать.

T.J. Crowder 15.06.2018 10:51

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