Я пытаюсь сопоставить массив объектов в реакции 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": []
}
]
@AndroidDev вы можете увидеть здесь ответ от API. i.stack.imgur.com/1Wenk.png
getForms - это свойство или функция?
это функция.
Поэтому я считаю, что вы должны называть это так, если это функция: this.props.getForms().data.map Вы забыли ()
Может быть, вы можете попробовать так:
{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: "" })
}
/>;
}):''}
Я пробовал, ни мой компонент, ни мои данные не отображаются
@AbdulRaufKhalid сделайте одну вещь, попробуйте отобразить там некоторые жестко закодированные данные, посмотрите, сработает ли это.
если это работает, это означает, что, вероятно, ваши данные не определены или что-то в этом роде. а если нет, то это означает, что есть проблема с вашим кодом.
так что это означает, что есть проблема с вашим кодом
я проверил имя поля приходит undefined
Давайте продолжим обсуждение в чате.
данные могут быть изначально не определены, поэтому проверьте, существуют ли они, прежде чем отображать их.
нравиться
this.props.getForms.data && this.props.getForms.data.map(item=>{
//render
})
Я пробовал, ни данные не отображаются, ни мой компонент не отображается
Как узнать, что ваш API возвращает данные? Можете ли вы использовать DevTools и убедиться, что ответ возвращает ожидаемые данные?