【发布时间】:2020-02-10 21:18:47
【问题描述】:
我正在尝试使用 PokeAPI 在 React 中制作 Pokemon 卡片。我希望卡片有 2 个侧面,一个正面和一个背面,并带有扩展的细节。由于 API 端点的工作方式,每个单独的 Pokemon 都必须调用其特定的端点以获取扩展的详细信息。现在我正在使用初始 api 调用(在 componentDidMount 内部)设置状态,它返回一个不详细的 pokemon 列表,包括它们的名称和 API 端点 url。此状态存储在名为“Cardcontainer”的基于类的容器中,该容器具有 2 个功能组件,“frontCard”和“backCard”,它们使用道具呈现。 backCard 数据通过点击事件的 HTTP 请求在 Cardcontainer 组件上检索,卡片将被翻转,显示详细信息。一切正常,但我无法将详细信息转到正确的卡上。我可以使用柯里化来解决我的问题吗?无论如何,我想保留我当前的设计,但是我可以使用柯里化来获取 componentDidMount 方法中的所有细节吗?你将如何解决这个问题?
卡片容器:
import React, { Component } from 'react';
import Frontcard from '../Components/frontCard';
import Backcard from '../Components/backCard';
class Cardcontainer extends Component {
state= {
pokemon: [],
cardBack: []
}
componentDidMount() {
const xhr = new XMLHttpRequest();
const url = 'https://pokeapi.co/api/v2/pokemon';
xhr.onload = () => {
if(xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
const pokeList = data.results;
this.setState(
{ ...this.state,
pokemon: pokeList,
}
)
}
else {
console.log('not ok')
}
}
xhr.open('GET', url, true);
xhr.send();
}
handleClick = (e) => {
const xhr = new XMLHttpRequest();
const url = `https://pokeapi.co/api/v2/pokemon/${e.currentTarget.firstChild.innerText}`;
xhr.onload = () => {
const backData = JSON.parse(xhr.responseText);
const joined = this.state.cardBack.concat(backData)
this.setState(
{
...this.state,
cardBack: joined
}
);
}
xhr.open('GET', url, true);
xhr.send();
}
render() {
return (
this.state.pokemon.map((poke, index)=>{
return (
<div onClick={this.handleClick}
className={"card-container"}
key={index}
>
<Frontcard name=
{this.state.pokemon[index].name}/>
<Backcard frontName=
{this.state.pokemon[index].name} number={index} name=
{this.state.cardBack[index]} />
</div>
)
})
)
}
}
export default Cardcontainer;
背卡:
import React from 'react';
const Backcard = (props) => {
const details = props;
console.log(!details.name? 'hi':details.name.name)
console.log()
return (
<div className={"card-back"}>
<h4>{details.name!==props.frontName? 'hi':
details.name.name}</h4>
</div>
)
}
export default Backcard;
【问题讨论】:
-
这里有很多事情我会做不同的事情。我认为柯里化不会对您有所帮助,但是可能会将 api 调用移动到特定于卡的组件中,而不是在容器中进行。还要查看新的
fetchapi,而不是直接使用 xhr。如果我有时间,我可以快速模拟一下我将如何构建它 -
@david 我将数据存储在不同的容器中没有任何问题,可以让每张卡进行 api 调用吗?这不是不好的做法,因为真正需要显示数据的唯一元素是被翻转的元素?这就是为什么我试图在点击上提出请求,但我正在学习,但并不真正知道。
-
这里有一些供你玩的东西:jsfiddle.net/t2udky8f 点击名称会将他们的类型添加到“卡片”中
标签: javascript reactjs currying