Komponen dalam React tidak berubah selepas perubahan keadaan (componentDidMount fetch)
P粉384679266
P粉384679266 2023-09-12 00:02:48
0
2
642

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

membalas semua(2)
P粉724737511

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粉311464935

this.articlesthis.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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan