Как получить доступ к массиву объектов из API в JS?

Я пытаюсь сопоставить массив объектов в реакции js. Мне нужно сделать две вещи: во-первых, мне нужно отображать поля в соответствии с типом ввода, а во-вторых, мне нужно сопоставить данные, поступающие из API, проблема заключается в том, что всякий раз, когда я пытаюсь сопоставить данные в моем компоненте он продолжает выдавать мне ошибку Uncaught TypeError: Cannot read property 'map' of undefined я застрял и не могу выбраться из него

Мой компонент

import React, { Component } from "react";
import {
  FormCardComponent,
  TextInputComponent,
  RadioInputComponent,
  SelectComponent,
} from "../../components/index";
import IntlMessages from "../../common/constants/IntlMessages";
import { TopBar } from "../../layouts/authLayout/components/index";
import { getEmsForms } from "../../redux/action/categories";
import { bindActionCreators } from "redux";
import { connect } from "react-redux";

class DummyForm extends Component {
  constructor(props) {
    super(props);
    this.state = {
      field: "",
      checkBox: "",
      options: "",
      radioField: "",
      error: "",
    };
  }
  componentDidMount() {
    this.props.getEmsForms();
  }

  render() {
    console.info("COMP", JSON.stringify(this.props.getForms.data));
    return (
      <React.Fragment>
        <div className = "col" style = {{ marginTop: "50px" }}>
          <React.Fragment>
//here iam maping the data
            {this.props.getForms.data.map((item) => {
              <TextInputComponent
                style = {{ marginTop: "50px" }}
                label = {item.fieldName}
                type = "text"
                placeholder = {"Abdul"}
                value = {this.state.name}
                onChange = {(e) =>
                  this.setState({ name: e.target.value, error: "" })
                }
              />;
            })}
            <select
              className = "custom-select"
              id = "inputGroupSelect01"
              style = {{ marginTop: "50px" }}
            >
              <option>yes</option>
              <option>yes</option>
            </select>
            <div style = {{ marginTop: "50px" }}>
              <SelectComponent
                style = {{ marginTop: "50px" }}
                name = {"select2"}
                value = {this.state.select2}
                label = {
                  "Jeg vil gerne modtage en SMS når der er nyheder til mig"
                }
                onChange = {(e) => this.setState({ select2: e.target.checked })}
              />
              <SelectComponent
                style = {{ marginTop: "50px" }}
                name = {"select2"}
                value = {this.state.select2}
                label = {
                  "Jeg vil gerne modtage en SMS når der er nyheder til mig"
                }
                onChange = {(e) => this.setState({ select2: e.target.checked })}
              />
              <SelectComponent
                style = {{ marginTop: "50px" }}
                name = {"select2"}
                value = {this.state.select2}
                label = {
                  "Jeg vil gerne modtage en SMS når der er nyheder til mig"
                }
                onChange = {(e) => this.setState({ select2: e.target.checked })}
              />
              <SelectComponent
                style = {{ marginTop: "50px" }}
                name = {"select2"}
                value = {this.state.select2}
                label = {
                  "Jeg vil gerne modtage en SMS når der er nyheder til mig"
                }
                onChange = {(e) => this.setState({ select2: e.target.checked })}
              />
            </div>
            <div style = {{ marginTop: "50px" }}>
              <RadioInputComponent
                title = "gender"
                value = {this.state.gender}
                name = {["male", "female", "other"]}
                onChange = {(e) => {
                  this.setState({ gender: e.target.value, error: "" });
                }}
              />
            </div>
            <div className = "row" style = {{ marginTop: "50px" }}>
              <div className = "col d-flex justify-content-start">
                <button className = "btn-danger" onClick = {this.toggleModal}>
                  Ja
                </button>
              </div>
              <div className = "col d-flex justify-content-end">
                <button className = "btn btn-success button-margin">Ja</button>
              </div>
            </div>
          </React.Fragment>
        </div>
      </React.Fragment>
    );
  }
}
const mapStateToProps = (data) => ({
  getForms: data.categories.forms,
});

const mapDispatchToProps = (dispatch) =>
  bindActionCreators(
    {
      getEmsForms,
    },
    dispatch
  );

export default connect(mapStateToProps, mapDispatchToProps)(DummyForm);

Мой ответ API

[
    {
        "question_id": 4,
        "fieldName": "LastName",
        "order": 0,
        "isRequired": true,
        "isShown": true,
        "isEditable": false,
        "fieldLabelText": "First Name da",
        "errorText": "First Name Error da",
        "inputType": "textbox",
        "inputOptions": [],
        "inputOptionsCustom": []
    },
    {
        "question_id": 3,
        "fieldName": "FirstName",
        "order": 1,
        "isRequired": true,
        "isShown": true,
        "isEditable": false,
        "fieldLabelText": "First Name da",
        "errorText": "First Name Error da",
        "inputType": "textbox",
        "inputOptions": [],
        "inputOptionsCustom": []
    },
    {
        "question_id": 2,
        "fieldName": "Age",
        "order": 2,
        "isRequired": true,
        "isShown": true,
        "isEditable": false,
        "fieldLabelText": "First Name da",
        "errorText": "First Name Error da",
        "inputType": "dropdown",
        "inputOptions": [
            {
                "option_id": 7,
                "text": "18",
                "value": "18"
            },
            {
                "option_id": 8,
                "text": "19",
                "value": "19"
            },
            {
                "option_id": 9,
                "text": "20",
                "value": "20"
            },
            {
                "option_id": 10,
                "text": "21",
                "value": "21"
            },
            {
                "option_id": 11,
                "text": "22",
                "value": "22"
            },
            {
                "option_id": 12,
                "text": "23",
                "value": "23"
            }
        ],
        "inputOptionsCustom": []
    },
    {
        "question_id": 5,
        "fieldName": "PhoneNumber",
        "order": 3,
        "isRequired": false,
        "isShown": true,
        "isEditable": false,
        "fieldLabelText": "First Name da",
        "errorText": "First Name Error da",
        "inputType": "textbox",
        "inputOptions": [],
        "inputOptionsCustom": []
    }
]

Как узнать, что ваш API возвращает данные? Можете ли вы использовать DevTools и убедиться, что ответ возвращает ожидаемые данные?

Johann 21.12.2020 08:53

@AndroidDev вы можете увидеть здесь ответ от API. i.stack.imgur.com/1Wenk.png

Abdul Rauf Khalid 21.12.2020 08:55

getForms - это свойство или функция?

Johann 21.12.2020 08:58

это функция.

Abdul Rauf Khalid 21.12.2020 09:11

Поэтому я считаю, что вы должны называть это так, если это функция: this.props.getForms().data.map Вы забыли ()

Johann 21.12.2020 09:43
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
0
5
1 327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Может быть, вы можете попробовать так:

{this.props.getForms.data?this.props.getForms.data.map((item) => {
              <TextInputComponent
                style = {{ marginTop: "50px" }}
                label = {item.fieldName}
                type = "text"
                placeholder = {"Abdul"}
                value = {this.state.name}
                onChange = {(e) =>
                  this.setState({ name: e.target.value, error: "" })
                }
              />;
            }):''}
   

Я пробовал, ни мой компонент, ни мои данные не отображаются

Abdul Rauf Khalid 21.12.2020 08:44

@AbdulRaufKhalid сделайте одну вещь, попробуйте отобразить там некоторые жестко закодированные данные, посмотрите, сработает ли это.

Sakshi 21.12.2020 08:45

если это работает, это означает, что, вероятно, ваши данные не определены или что-то в этом роде. а если нет, то это означает, что есть проблема с вашим кодом.

Sakshi 21.12.2020 08:46

так что это означает, что есть проблема с вашим кодом

Sakshi 21.12.2020 08:49

я проверил имя поля приходит undefined

Abdul Rauf Khalid 21.12.2020 08:51

Давайте продолжим обсуждение в чате.

Sakshi 21.12.2020 09:12

данные могут быть изначально не определены, поэтому проверьте, существуют ли они, прежде чем отображать их.

нравиться

this.props.getForms.data && this.props.getForms.data.map(item=>{
//render
})

Я пробовал, ни данные не отображаются, ни мой компонент не отображается

Abdul Rauf Khalid 21.12.2020 08:43

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