4 回答

TA貢獻1963條經驗 獲得超6個贊
只是關于如何使用鉤子和功能組件以另一種方式處理這個問題的想法。正如其他人已經提到的,代碼中的主要問題是回調未返回結果或設置為狀態(tài)。
const MyTop10Artists = () => {
const [artists, setArtists] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState();
useEffect(() => {
Api.getMyTopArtists((err, data) => {
if (err) {
console.error(err);
setError(err);
return;
}
setArtists(data.items);
setIsLoading(false);
});
}, []);
return (
<>
{isLoading && "Loading"}
{error && error}
{!isLoading && artists.length === 0 && "No artists"}
{!isLoading &&
artists.map((artist) => (
<div key={artist.id} className="card">
<div key={artist.id} className="cardContent">
<h3>{artist.name}</h3>
</div>
</div>
))}
</>
);
};
const API = () => (
<div className="cardsWrap">
<MyTop10Artists />
</div>
);

TA貢獻1847條經驗 獲得超11個贊
存儲items狀態(tài)并使用 api 響應更新它。這將導致您的組件重新渲染。
另外,將您的 api 調用移至組件掛鉤
componentDidMount(){
Api.getMyTopArtists(function (err, data) {
this.setState({
items: data.items
})
}

TA貢獻1780條經驗 獲得超5個贊
這是行不通的,因為您是從回調返回數據,而是需要將this.setState()獲取的數據存儲到您的狀態(tài)中,然后顯示它。
class API extends Component {
constructor(props){
super(props);
this.state = {
data: null,
error: null
}
this.myTop10Artists = this.myTop10Artists.bind(this);
}
componentDidMount(){
this.myTop10Artists();
}
myTop10Artists() {
Api.getMyTopArtists(function (err, data) {
if (err) {
this.setState({...this.state, error: err});
} else {
this.setState({error: null, data})
}
});
}
render() {
const {error, data} = this.state;
if(error){
return <div>Error! Try again</div>
}
if(!data){
return <div>Loading..</div>
}
return (
<div>
data.items.map((artist) => (
<div key={artist.id} className="card">
<div key={artist.id} className="cardContent">
<h3> {artist.name} </h3>{" "}
</div>{" "}
</div>
))
</div>
)
}
}

TA貢獻2065條經驗 獲得超14個贊
1-在返回值中使用映射函數
2-使用圓括號而不是大括號來包圍箭頭函數
return ({data.items.map((artist) => (
<div key={artist.id} className="card">
<div key={artist.id} className="cardContent">
<h3> {artist.name} </h3>{" "}
</div>{" "}
</div>
))};
);
添加回答
舉報