Rumah > Soal Jawab > teks badan
Saya mengikuti tutorial untuk membuat aplikasi berita, saya mendapat data daripada newapi, kod saya sama seperti dalam tutorial, tetapi selepas saya mengemas kini keadaan (this.state.articles), komponen saya tidak ubah. Saya menggunakan fungsi setState, saya cuba log keadaan dalam konsol, keadaan kelihatan baik selepas kemas kini, kaedah render berjalan, tetapi tiada apa-apa yang berubah, sesuatu mungkin telah berlaku
Kod/komponen saya
import React, { Component } from 'react' import NewsItem from './NewsItem' export default class News extends Component { articles = [ { "source": { "id": "espn-cric-info", "name": "ESPN Cric Info" }, "author": null, "title": "PCB hands Umar Akmal three-year ban from all cricket | ESPNcricinfo.com", "description": "Penalty after the batsman pleaded guilty to not reporting corrupt approaches | ESPNcricinfo.com", "url": "http://www.espncricinfo.com/story/_/id/29103103/pcb-hands-umar-akmal-three-year-ban-all-cricket", "urlToImage": "https://a4.espncdn.com/combiner/i?img=%2Fi%2Fcricket%2Fcricinfo%2F1099495_800x450.jpg", "publishedAt": "2020-04-27T11:41:47Z", "content": "Umar Akmal's troubled cricket career has hit its biggest roadblock yet, with the PCB handing him a ban from all representative cricket for three years after he pleaded guilty of failing to report det… [+1506 chars]" }, { "source": { "id": "espn-cric-info", "name": "ESPN Cric Info" }, "author": null, "title": "What we learned from watching the 1992 World Cup final in full again | ESPNcricinfo.com", "description": "Wides, lbw calls, swing - plenty of things were different in white-ball cricket back then | ESPNcricinfo.com", "url": "http://www.espncricinfo.com/story/_/id/28970907/learned-watching-1992-world-cup-final-full-again", "urlToImage": "https://a4.espncdn.com/combiner/i?img=%2Fi%2Fcricket%2Fcricinfo%2F1219926_1296x729.jpg", "publishedAt": "2020-03-30T15:26:05Z", "content": "Last week, we at ESPNcricinfo did something we have been thinking of doing for eight years now: pretend-live ball-by-ball commentary for a classic cricket match. We knew the result, yes, but we tried… [+6823 chars]" } ] constructor() { super(); this.state = { articles: this.articles, loading: false } } async componentDidMount() { const URL = "https://newsapi.org/v2/top-headlines?country=us&category=business&apiKey=" let data = await fetch(URL); let parsedData = await data.json() this.setState({ articles: parsedData.articles }) console.log(this.state.articles) } render() { console.log("render") return ( <div> <div className="container"> <h2 className='my-4 mx-4'> NewsMonkey - Top Headlines </h2> <div className="row"> {this.articles.map((elem) => { return <div className="col-md-4" key={elem.url}> <NewsItem title={elem.title?elem.title.slice(42):""} desc={elem.description?elem.description.slice(0, 88): ""} url={elem.url} imgURL={elem.urlToImage} /> </div> })} </div> </div> </div> ) } }
P粉7247375112023-09-12 17:52:54
Hai @Curious, kod anda betul
Hanya beri perhatian semasa membuatmap
Anda menggunakan this.articles
, iaitu senarai tetap (simulasi)
Anda perlu memanggil this.state.articles
中调用map
dalam this.state.articles
kerana ini adalah keadaan yang anda ubah dalam didMount
P粉3114649352023-09-12 16:04:16
this.articles
和 this.state.articles
Tak sama.
Anda mempunyai sifat statik this.articles
,你在渲染逻辑中使用了它 - this.articles.map(...
. Pengambilan anda sedang mengemas kini keadaan (operasi biasa).
Kemas kini logik pemaparan anda untuk membaca data daripada this.state.articles
dan kemudian ia akan berfungsi.