简体   繁体   English

如何从API获取React JS组件中多个项目的数据

[英]How to fetch data from API for multiple items in React JS component

I am trying fetch data from API in my React JS component. 我正在尝试从我的React JS组件中的API获取数据。 Link to API . 链接到API This API will populate the number count of each vehicle. 该API将填充每辆车的数量。 The last argument 'audi' corresponds to vehicle make name. 最后一个参数“ audi”对应于车辆品牌名称。 I need to fetch that data for 64 different vehicles and create dynamic list items (li) but don't know how to do that. 我需要获取用于64种不同车辆的数据并创建动态列表项(li),但不知道该怎么做。 Everything is working except fetchCount function. 除fetchCount函数外,其他所有东西都在工作。

Here is an example of vehicles data which is imported from '../shared/vehicle_make_and_models' there are total 64 care makes. 这是从“ ../shared/vehicle_make_and_models”导入的车辆数据的示例,共有64个保养项目。

const veh_data = [
{ "alfa-romeo": ["145", "90", "Alfa 6", "Alfasud"] },
{ "aston-martin": ["15", "2-Litre", "AM Vantage", "Atom", "Cygnet", "DB2"]},
{ "audi": ["100", "200", "A1", "A2", "A3", "A4", "A5", "A6", "A7"] }
];

Here is my code: 这是我的代码:

import React, { Component } from 'react';
import { veh_data } from '../shared/vehicle_make_and_models'

class ShopByMake extends Component {
constructor(props) {
    super(props);

    this.fetchCount = this.fetchCount.bind(this);

    this.state = {
        veh_data: veh_data,
    };
}

fetchCount(make) {

    fetch('https://mysterious-journey-51969.herokuapp.com/api/vehicle-make-count/' + make)
            .then(response => {
                return response.json();
            })
            .then(data => {
            let firstKey = Object.keys(data)[0],
                count = data[firstKey];
            console.log('make count' + count);
            return count;
        })
        .catch(err => console.log(err)); 
  }

render() {

    const vehicles = this.state.veh_data.reduce((acc, veh) => {
        let make = Object.keys(veh)[0]

        return {
            makes: [
                ...acc.makes,
                <li className="mt-2"><a href="#"><img src={require('../assets/images/audi-logo.jpg')} className="img-fluid logos" /><span className="ml-4 list-text">{make} ({this.fetchCount(make)})</span></a></li>
            ]
        };
    }, { makes: [] });

    return (
        <div>
            <div className="headings-div text-center text-white mt-4 mt-lg-0"><h5 className="headings">Shop By Make</h5></div>
            <div className="mt-3" id="shopbymake">
                <ul className="list-unstyled">
                    {vehicles.makes}
                </ul>
            </div>
        </div>
    );
}
}

export default ShopByMake;
  1. To perform the requests concurrently you could use Promise.all() . 要同时执行请求,可以使用Promise.all()

  2. When all requests are complete, filter out any null responses veh_data_with_count.filter(res=> res) 完成所有请求后,过滤掉所有null响应veh_data_with_count.filter(res=> res)

  3. Assign the veh_data_with_count property on the State Object using setState() to notify React of the changes and allow it to update the DOM if necessary. 使用setState()State Object上分配veh_data_with_count属性,以将这些更改通知React,并在必要时允许它更新DOM。

 import React, { Component } from "react"; import axios from "axios"; // import { veh_data } from '../shared/vehicle_make_and_models' const veh_data = [ { "alfa-romeo": ["145", "90", "Alfa 6", "Alfasud"] }, { "aston-martin": ["15", "2-Litre", "AM Vantage", "Atom", "Cygnet", "DB2"] }, { audi: ["100", "200", "A1", "A2", "A3", "A4", "A5", "A6", "A7"] } ]; class ShopByMake extends Component { constructor(props) { super(props); // this.fetchCount = this.fetchCount.bind(this); this.state = { veh_data_with_count: [] }; } componentDidMount() { Promise.all( veh_data.map(async car => { let make = Object.keys(car)[0]; let res = await axios .get( "https://mysterious-journey-51969.herokuapp.com/api/vehicle-make-count/" + make.split('-').join('') ) .catch(err => console.log(err)); if (!res || !res.data) return null; let firstKey = Object.keys(res.data)[0], count = res.data[firstKey]; return { make, count }; }) ) .then(veh_data_with_count => { let removeFails = veh_data_with_count.filter(res=> res) this.setState({ veh_data_with_count: removeFails }); }) .catch(err => console.log(err)); } render() { const vehicles = this.state.veh_data_with_count.map( ({ make, count }, i) => { return ( <li key={i} className="mt-2"> <a href="#"> <img src="" className="img-fluid logos" /> <span onClick={() => this.fetchCount(make)} className="ml-4 list-text" > {make} {count} </span> </a> </li> ); } ); return ( <div> <div className="headings-div text-center text-white mt-4 mt-lg-0"> <h5 className="headings">Shop By Make</h5> </div> <div className="mt-3" id="shopbymake"> <ul className="list-unstyled">{vehicles}</ul> </div> </div> ); } } export default ShopByMake; 

https://codesandbox.io/s/lryq5lvn4q?moduleview=1 https://codesandbox.io/s/lryq5lvn4q?moduleview=1

您可以创建一个API,该API将返回所有vehicle_make_name的计数,然后根据需要填充该数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM