Как отобразить вложенный массив объектов из вызова REST в разных разделах страницы?

#javascript #reactjs #rest #fetch

Вопрос:

У меня есть вызов REST, который возвращает разные наборы результатов. Каждый набор данных содержит данные для разных частей страницы. Он содержит вложенный массив объектов, и я не уверен, как мне легко отобразить пары имен и значений из вызова rest на моей странице в зависимости от определенного раздела.

Вот как выглядит ответ на вызов ОСТАЛЬНЫХ:

 {
    "dstrSpecificHelpRs": [
        {
            "row": [
                {
                    "name": "HELP_TEXT_TITLE_NM",
                    "value": "TestAgain and again and again and again andagain50",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELP_TEXT_ID",
                    "value": "100114",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "Help",
                    "value": "Help",
                    "link": {
                        "exists": true,
                        "linkType": "url",
                        "linkId": "www.google.com"
                    }
                }
            ]
        },
        {
            "row": [
                {
                    "name": "HELP_TEXT_TITLE_NM",
                    "value": "Testing  Helpline Page and 2301 DisasterONLY",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELP_TEXT_ID",
                    "value": "100174",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "Help",
                    "value": "Help",
                    "link": {
                        "exists": true,
                        "linkType": "url",
                        "linkId": "www.google.com"
                    }
                }
            ]
        }
    ],
    "rgstInfoRs": [
        {
            "row": [
                {
                    "name": "PREFIX_NM",
                    "value": "MS",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "FST_NM",
                    "value": "MITZI",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "insSettlementRs": [
        {
            "row": [
                {
                    "name": "ON_FILE",
                    "value": "0",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "dstrOptionRs": [
        {
            "row": [
                {
                    "name": "DSTR_OPTION",
                    "value": "1",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELPLINE_AREA_CD",
                    "value": "818",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELPLINE_PHN_NR",
                    "value": "5055511",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "correspondenceOutRs": [
        {
            "row": [
                {
                    "name": "SUMMARY_CD_TX",
                    "value": "SUPER,SEAL,APPR_INTRO,APPROVAL,ECNA",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        },
        {
            "row": [
                {
                    "name": "SUMMARY_CD_TX",
                    "value": "9069CL,SEAL",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "ASTN_PGM_CD",
                    "value": "MISC",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "GENERATED_DT",
                    "value": "2020-09-03 14:08:10.0",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "statePhoneRs": [],
    "insAssistanceRs": [
        {
            "row": [
                {
                    "name": "DOC_ID",
                    "value": "",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "RGSN_ID",
                    "value": "370002900",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ]
}
 

и вот над чем я работаю до сих пор:

 class App extends React.Component {
  constructor(props) {
    super(props);
    this.setState = {
      data: []
    };
  }

  componentDidMount() {
    fetch("https://demo3531217.mockable.io/getRegistrationData")
      .then((res) => res.json())
      .then((res) => {
        const responseData = this.getPayloadObject(res);
        this.setState({
          data: responseData
        });
      })
      .catch((error) => console.error(error));
  }

  getPayloadObject = (action) => {
    console.log(action);
    Object.keys(action).forEach((key) => {
      if (typeof action[key] === "object") {
        const payload = action[key];
        let result = _.map(
          payload,
          (data, i) => {
            const row = data["row"];
            const rowData = _.map(row, (item) => {
              return {
                name: item.name,
                value: item.value
              };
            });
            console.log("rowData ", rowData);
          },
          []
        );
        return resu<
      }
    });
  };

  render() {
    return (
      <div>
        <div>
          <h1>Section 1</h1>
        </div>
        <div>
          <h1>Section 2</h1>
        </div>
      </div>
    );
  }
}
 

если бы я хотел отобразить определенные данные для определенного раздела, как я могу это сделать на своей странице? Может кто-нибудь, пожалуйста, помочь?

ссылку на песочницу можно найти здесь: https://codesandbox.io/s/vibrant-sid-i140l?file=/src/App.js:75-1304

Ответ №1:

Давайте попробуем разбить состояние на несколько разделов. Что-то вроде этого.

 constructor(props) {
    super(props);
    this.state = {
      dstrSpecificHelpRs: [],
      rgstInfoRs: [],
      insSettlementRs: [],
      dstrOptionRs: [],
      correspondenceOutRs: [],
      statePhoneRs: [],
      insAssistanceRs: []
    };
  }
 

Затем давайте разберем ответ API и установим отдельные элементы в состояние.

 componentDidMount() {
    fetch("https://demo3531217.mockable.io/getRegistrationData")
      .then((res) => res.json())
      .then((res) => {
        // const responseData = this.getPayloadObject(res);
        const {
          dstrSpecificHelpRs,
          rgstInfoRs,
          insSettlementRs,
          dstrOptionRs,
          correspondenceOutRs,
          statePhoneRs,
          insAssistanceRs
        } = res;
        this.setState({
          dstrSpecificHelpRs: dstrSpecificHelpRs,
          rgstInfoRs: rgstInfoRs,
          insSettlementRs: insSettlementRs,
          dstrOptionRs: dstrOptionRs,
          correspondenceOutRs: correspondenceOutRs,
          statePhoneRs: statePhoneRs,
          insAssistanceR: insAssistanceRs
        });
      })
      .catch((error) => console.error(error));
  }
 

Теперь все, что вам нужно сделать, это найти способ перебирать отдельные элементы в состоянии. Что-то вроде этого

 render() {
    const dstrSpecificHelpRs = this.state.dstrSpecificHelpRs.map(row => row["row"]);
    console.log("Sample = ", sample);
    return (
      <div>
        <div>
          <h1>Section 1</h1>
          <div>
            {dstrSpecificHelpRs.map(item => item.map(key => <p>{key.name}</p>))}
          </div>
        </div>
        <div>
          <h1>Section 2</h1>
        </div>
      </div>
    );
  }
 

Однако это ни в коем случае не идеальное решение. Если бы вы могли изменить модель ответа, это было бы мило!.