【发布时间】:2020-11-11 06:23:27
【问题描述】:
当主组件加载时,我向我的 API 发送一个 GET 请求,以获取在名为 "ship_name" 的字段中具有特定值的所有对象,这意味着可能会到达更多“构建”,因此会有更多呈现。加载主组件后,我在同一个文件中创建了第二个组件,称为“Builds”。作为道具,我向这个组件发送 this.state.builds,一个对象数组。
更好的解释:
- 用户在搜索栏中插入“ship_name”
- API 会查找具有该“ship_name”的所有构建
- 所有构建都发送到子组件
- 使用“gears”(齿轮名称)API 查找文件名并将其发回
- !在链接到达之前反应渲染
<Builds builds={this.state.builds} />
“构建”的结构是这样的
[
{
"gears": [
"Triple 410mm (10th Year Type Prototype)",
"Triple 155mm (3rd Year Type)",
"Twin 40mm Bofors STAAG Mk II",
"High Performance Fire Control Radar",
"Type 1 Armor Piercing Shell"
],
"rarities": [
"o",
"o",
"o",
"o",
"o"
],
"_id": "5eac7b450e64096b082f4c43",
"ship_name": "Gascogne",
"pv": "e"
},
{
"gears": [
"Triple 410mm (10th Year Type Prototype)",
"Triple 155mm (3rd Year Type)",
"Twin 40mm Bofors STAAG Mk II",
"High Performance Fire Control Radar",
"Type 1 Armor Piercing Shell"
],
"rarities": [
"o",
"o",
"o",
"o",
"o"
],
"_id": "5f131d6e2e3f16ef3de48e4f",
"ship_name": "Gascogne",
"pv": "e"
}
]
到目前为止一切正常。
render() {
return (
this.props.builds.map((build) => (
<div className="container" key={uuidv4()}>
<img src={"/img/gears/" + this.getGearData(build.gears[0])} className={build.rarities[0] + " gI g1"}></img><div className={"t t1"}>{build.gears[0]}</div>
<img src={"/img/gears/" + this.getGearData(build.gears[1])} className={build.rarities[1] + " gI g2"}></img><div className={"t t2"}>{build.gears[1]}</div>
<img src={"/img/gears/" + this.getGearData(build.gears[2])} className={build.rarities[2] + " gI g3"}></img><div className={"t t3"}>{build.gears[2]}</div>
<img src={"/img/gears/" + this.getGearData(build.gears[3])} className={build.rarities[3] + " gI g4"}></img><div className={"t t4"}>{build.gears[3]}</div>
<img src={"/img/gears/" + this.getGearData(build.gears[4])} className={build.rarities[4] + " gI g5"}></img><div className={"t t5"}>{build.gears[4]}</div>
</div>
))
)
}
/*------------------------------*/
getGearData(gear_name) {
let requestString = encodeURI('http://localhost:5000/gears/one?q=' + gear_name)
let data;
Axios.get(requestString)
.then(res => {
console.log(res.data[0].image_link)
data = res.data[0].image_link
})
return data
/* what */
}
这里发生的情况是,在渲染的同时,我试图获取图像的 URL。 GET 方法有效,实际上 console.log 打印文件的实际名称
32200.png gear.component.js:76
26600.png gear.component.js:76
1260.png gear.component.js:76
600.png gear.component.js:76
34180.png gear.component.js:76
但在 SRC 上,结果是 "/img/gears/undefined"。我无法理解的一件事是为什么所有结果都被打印了 2 次,但这并不是什么大问题,因为最终这些东西只被正确渲染了一次。
我尝试过使用许多方法、状态、Promises(即使我还没有真正理解它们是如何工作的),这是我第一次真正陷入这样的困境。事实上,主要组件使用“ship_name”来获取“ship_icon”和“faction_icon”的文件名并且没有问题,可能是因为我使用了那里的状态。
这里是它现在的样子
这里有一个关于它应该是什么样子的想法
我曾经使用 php 和 SQL 完成了这个个人项目,现在我正在尝试使用 React 和 MongoDB 来完成。
【问题讨论】:
-
这段代码有很多问题。我认为您应该首先了解异步 JavaScript。您的
Axios.get()调用是异步的,您甚至在获取之前就返回了data。状态管理是第二件事。您获取的数据应该以组件状态存储。第三,您需要在componentDidMount()生命周期钩子或等效的 React 钩子中调用您的 API。清除概念在这里更重要。恕我直言,仅仅解决这个问题并没有多大帮助! -
然后,特别是 React:How to set state of response from axios in react
-
那么,looping inside JSX would help。下面的An answer 还向您展示了如何操作。
标签: javascript reactjs