Komponente in React ändert sich nach Statusänderung nicht (componentDidMount fetch)
P粉384679266
P粉384679266 2023-09-12 00:02:48
0
2
646

Ich folge einem Tutorial zum Erstellen einer Nachrichten-App. Ich erhalte Daten von Newapi. Mein Code ist derselbe wie im Tutorial, aber nachdem ich den Status (this.state.articles) aktualisiere, wird dies bei meiner Komponente nicht mehr der Fall sein ändern. Ich habe die setState-Funktion verwendet, ich habe versucht, den Status in der Konsole zu protokollieren, der Status sah nach dem Update gut aus, die Render-Methode wurde ausgeführt, aber nichts hat sich geändert, möglicherweise ist etwas schief gelaufen

Mein Code/meine Komponente

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粉384679266
P粉384679266

Antworte allen(2)
P粉724737511

嗨 @Curious,你的代码是正确的

只需要在制作map时注意一下

你正在使用this.articles,这是一个固定(模拟)列表

你需要在this.state.articles中调用map,因为这是你在didMount中更改的状态

P粉311464935

this.articlesthis.state.articles 不是相同的。

你有一个静态属性 this.articles,你在渲染逻辑中使用了它 - this.articles.map(...。你的 fetch 正在更新状态(正常操作)。

更新你的渲染逻辑,从 this.state.articles 读取数据,然后它应该可以工作。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage