React native: «Нарушение инварианта: объекты недействительны в качестве дочернего элемента React»

Целый день гуглил и нашел похожие проблемы, но не нашел ответов, которые решают мою проблему. Кажется, что «timeLeft», указанный как «до» в обратном отсчете, является объектом, хотя журнал (typeof timeLeft) говорит, что это число (как и должно быть).

Я получаю сообщение об ошибке: Нарушение инварианта: Нарушение инварианта: Нарушение инварианта: Объекты недействительны в качестве дочернего элемента React (найдено: объект с ключами {_40, _65, _55, _72}). Если вы хотели отобразить коллекцию дочерних элементов, используйте вместо этого массив.

render() {
      return (
        <View style = {styles.container}>
          <ScrollView>
          <View>  
          {
            this.state.auctions.map(async (auctionObject, index) => {
              var timeLeft = await this.getTimeLeft(auctionObject.expiration);
              console.info(JSON.stringify(timeLeft) + typeof timeLeft)
              
              return <View style = {styles.auctionObject} key = {index + 'a'}>
                <Text key = {index + 'b'} onPress = {() => this._renderObjectPage(auctionObject)}>
                  TITLE: {auctionObject.title} {"\n"}
                  HIGHEST BID: {auctionObject.highestBid} {"\n"}
                  NUMBER OF LIKES:{auctionObject.numberOfLikes}
                </Text>
                <CountDown key = {index + 'c'}
                  until = {timeLeft}
                  timetoShow = {('H', 'M', 'S')}
                  size = {12}
                />
                </View>
            } 
            )
          }
          </View>
          </ScrollView>

Спасибо

Остерегайтесь чего-либо асинхронного внутри вашего рендера

Kai 12.03.2019 23:55

Отлично! Если я удаляю асинхронность, переменная timeLeft не разрешается и становится объектом с ключами {_40, _65, _55, _72})

PaddyMcDaddy 12.03.2019 23:57
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
131
1

Ответы 1

Проблема в том, что ваша функция рендеринга выводит список объектов Promise (который не является допустимым кодом реакции):

this.state.auctions.map(async (auctionObject, index) => {
              var timeLeft = await this.getTimeLeft(auctionObject.expiration);

Вопрос: Вы уверены, что операция getTimeLeft должна быть асинхронной? Если это так, то эту операцию нужно будет выполнить вне функции рендеринга (возможно, в componentDidMount или componentDidUpdate).

Если вы можете изменить getTimeLeft на синхронный, он будет работать:

this.state.auctions.map((auctionObject, index) => {
              var timeLeft = this.getTimeLeft(auctionObject.expiration);

Спасибо, это имеет смысл! Может ли быть способ поставить «ожидание» перед, скажем, «возвратом» внутри сопоставления, чтобы убедиться, что промисы разрешены перед рендерингом?

PaddyMcDaddy 13.03.2019 15:06

nw — нет, абсолютно нет — функция рендеринга спроектирована так, чтобы быть синхронной, так как эту функцию можно вызывать в любое время и иногда много раз в секунду. Ваш компонент должен иметь другой механизм, с помощью которого он разрешает данные (как я предложил выше), а функция рендеринга просто выводит html-код на основе данных, сохраненных в состоянии.

jsdeveloper 13.03.2019 15:44

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