gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:11:23 25 4
gpt4 key购买 nike

我正在尝试从 React JS 组件中的 API 获取数据。 Link to API 。该 API 将填充每辆车的数量。最后一个参数'audi'对应于车辆品牌名称。我需要获取 64 种不同车辆的数据并创建动态列表项 (li),但不知道该怎么做。除了 fetchCount 函数之外,一切正常。

这是从“../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"] }
];

这是我的代码:

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. 要同时执行请求,您可以使用 Promise.all() .

  2. 当所有请求完成后,过滤掉任何 null 响应 veh_data_with_count.filter(res=> res)

  3. State 上分配 veh_data_with_count 属性对象使用 setState() 通知 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

关于javascript - 如何从 React JS 组件中的多个项目的 API 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com