Получение данных из БД по нескольким API

Подскажите, пожалуйста, как организовать получение данных из БД в ReactJS с нескольких API?

Бэк: Django + DRF, фронт: React, БД: PostgreSQL

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Paper from '@material-ui/core/Paper';
import Table from '@material-ui/core/Table';
import TableBody from '@material-ui/core/TableBody';
import TableCell from '@material-ui/core/TableCell';
import TableContainer from '@material-ui/core/TableContainer';
import TableHead from '@material-ui/core/TableHead';
import TablePagination from '@material-ui/core/TablePagination';
import TableRow from '@material-ui/core/TableRow';
import * as ReactDOM from 'react-dom';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [],
      loaded: false,
      placeholder: "Загрузка..."
    };
  }

  /**
   * api/department
   * api/battalion
   * api/division
   * api/echelon
   * api/structure
   */

  componentDidMount() {
    fetch("api/department")
      .then(response => {
        if (response.status > 400) {
          return this.setState(() => {
            return {
              placeholder: "Что-то пошло не так!"
            };
          });
        }
        return response.json();
      })
      .then(data => {
        this.setState(() => {
          return {
            data,
            loaded: true
          };
        });
      });
  }

  render() {
    return (
        <Paper className={classes.root}>
            <TableContainer className={classes.container}>
                <Table stickyHeader aria-label="sticky table">
                    <TableHead>
                        <TableRow>
                            {columns.map((column) => (
                                <TableCell
                                    key={column.id}
                                    align={column.align}
                                    style={{minWidth: column.minWidth}}
                                >
                                    {column.label}
                                </TableCell>
                            ))}
                        </TableRow>
                    </TableHead>
                    <TableBody>
                        {rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
                                 .map((row) => {
                                     return (
                                         <TableRow hover role="checkbox" tabIndex={-1} key={row.code}>
                                             {columns.map((column) => {
                                                 const value = row[column.id];
                                                 return (
                                                     <TableCell key={column.id} align={column.align}>
                                                         {column.format && typeof value === 'number' ? column.format(value) : value}
                                                     </TableCell>
                                                 );
                                             })}
                                         </TableRow>
                                     );
                                 })}
                    </TableBody>
                </Table>
            </TableContainer>
            <TablePagination
                rowsPerPageOptions={[10, 25, 100]}
                component="div"
                count={rows.length}
                rowsPerPage={rowsPerPage}
                page={page}
                onChangePage={handleChangePage}
                onChangeRowsPerPage={handleChangeRowsPerPage}
            />
        </Paper>
    )
  }
}

export default App;

const container = document.getElementById("app");
render( < App / > , container);
<!DOCTYPE html>
<html lang="ru">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>123</title>
</head>

<body>
  <div id="header"></div>
  <div id="app"></div>
</body>


<script type="module" src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script type="module" src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script type="module" src="https://unpkg.com/@material-ui/core@latest/umd/material-ui.development.js"></script>

</html>


Ответы (1 шт):

Автор решения: 1Pauletto

Если имеется ввиду несколько эндпоинтов и можно кидать запросы в параллель, то я бы предложил такой вариант:

componentDidMount() {
  Promise.all([
    fetch('api/department'),
    fetch('api/battalion'),
    fetch('api/division'),
    fetch('api/echelon'),
    fetch('api/structure)'),
  ]).then(
    async ([
      departmentResponse,
      battalionResponse,
      divisionResponse,
      echelonResponse,
      structureResponse,
    ]) => {
      const department = await departmentResponse.json();
      const battalion = await battalionResponse.json();
      const division = await divisionResponse.json();
      const echelon = await echelonResponse.json();
      const structure = await structureResponse.json();

      // и далее логика
    }
  );
}
→ Ссылка