React-native AJAX и API - рендеринг данных JSON

Я действительно новичок в реакции. Мой вопрос в том, как выполнить итерацию компонента и отобразить данные json. Вот мой код:

import React from 'react';
import { ScrollView, StyleSheet, Text, View } from 'react-native';
import { Divider } from 'react-native-elements';
import { limitUI04 } from 'uuid-js';


export default class SearchProperty extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      error: null,
      isLoaded: false,
      items: []
    }
  }

  componentDidMount() {
    fetch("myapiendpoint", {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
    })
      .then(res => res.json())
      .then(
        (result) => {
          this.setState({
            isLoaded: true,
            items: result.data
          });
        },
        (error) => {
          this.setState({
            isLoaded: true,
            error
          });
        }
      )
  }

  render() {
    const { error, isLoaded, items } = this.state;
    {
      items.map(key => {
        return (
          <Text>
            {key.id}
          </Text>
        )
      })
    }
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

Мой код выше возвращает ошибку:

Invariant Violation: Invariant Violation: SearchProperty(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.

Пожалуйста помоги

вам не хватает декларации о возврате ...

Bens Steves 09.12.2018 00:51

Мое возвращение там, внутри метода карты. @BensSteves

Hendro Febrian 09.12.2018 00:52

В моем коде я сделал метод componentDidMount (), будет ли этот метод выполняться автоматически? @BensSteves

Hendro Febrian 09.12.2018 00:53

да, ваш компонентDidMount будет выполняться автоматически. Оператор return в функции карты предназначен только для функции карты. Это оператор возврата для этой функции. Но для реакции требуется оператор return после вашего render () {... Если вы его не укажете, response не имеет ни малейшего понятия, что делать и как интерпретировать вашу функцию карты.

Bens Steves 09.12.2018 00:56

вы можете поискать методы жизненного цикла на веб-сайте документации React, чтобы лучше понять каждый из них. Вот ссылка: reactjs.org/docs/…

Bens Steves 09.12.2018 01:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
5
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не хватает инструкции возврата после render

render() {
    const { error, isLoaded, items } = this.state;
    return (
     <div>
      {
       items.map(key => {
        return (
          <Text key = {key.id}>
            {key.id}
          </Text>
        )
      })
    }
   </div>
  }
 )
}

это должно быть хорошо.

Примечание: помните, когда вы сопоставляете что-либо, самый внешний элемент или ваш корневой элемент в операторе return функции сопоставления должен включает уникальный ключ. Поскольку я предполагаю, что ваш key.id уникален, вы можете использовать его как свой уникальный ключ.

Обновленный ответ:

import React, { Component } from "react";
import logo from "./logo.svg";
import "./App.css";
class App extends Component {
  state = {
    error: null,
    isLoaded: false,
    items: [
      { id: 1, name: "Apples", price: "$2" },
      { id: 2, name: "Peaches", price: "$5" }
    ]
  };
  componentWillMount() {
    this.setState({ items: [...this.state.items, { id: 3 }] }, () => {
      this.displayItems(this.state.items);
    });
  }
  displayItems = items => {
    console.info(items);
    return items.map(key => {
      return <div key = {key.id}>{key.id}</div>;
    });
  };
  render() {
    const { items } = this.state;
    return <div>{this.displayItems(items)}</div>;
  }
}

export default App;

Я изменил didMount на WillMount (). WillMount () будет монтироваться (каламбур не предназначен) до того, как что-либо будет отрисовано. Затем компонент отобразит функцию карты. Так что состояние обновлено. Я отправил элементы из WillMount () в новую функцию displayItems для дополнительной уверенности в том, что состояние будет обновляться. Надеюсь это поможет.

Обновлено: ВНИМАНИЕ

Я использовал здесь WillMount (), но не включил UNSAFE. componentWillMount() больше не будет работать после версии 17. Вы можете использовать UNSAFE_componentWillMount(). Это будет работать в версии 17. Извините за это (я привык просто выбирать это из IntelliSense).

квадратная скобка прямо внутри внешнего оператора возврата вызывает ошибку

Hendro Febrian 09.12.2018 00:57

ах да спасибо. Вам нужен корневой элемент div или корневой элемент в каждом операторе возврата. Извини за это.

Bens Steves 09.12.2018 00:58

у вас не может быть более одного корневого элемента. так что смотрите div ... у вас может быть только один внешний div, у вас не может быть смежных div, таких как <div> ... map function </div> <div> </div>. Это ответ "нет-нет". вы получите ошибку синтаксического анализа, не может быть смежных элементов jsx. или элементы jsx должны быть заключены во включающий тег. заметьте, я просто использую div в качестве примера, это может быть любой элемент.

Bens Steves 09.12.2018 01:01

Хм, теперь у меня новая ошибка. Объект "Мои предметы" не определен. Можете ли вы снова понять, что не так?

Hendro Febrian 09.12.2018 01:02

где вы разместили свои предметы? или где вы определили пункты? не часть const {items} = this.state, а где в исходном коде вы фактически присвоили элементам значение

Bens Steves 09.12.2018 01:04

внутри componentDidMount (). Сразу после получения ответа ajax я вызываю метод setState

Hendro Febrian 09.12.2018 01:05

Позвольте нам продолжить обсуждение в чате.

Bens Steves 09.12.2018 01:06

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