recherche

Maison  >  Questions et réponses  >  le corps du texte

Le composant dans React ne change pas après le changement d'état (componentDidMount fetch)

Je suis un tutoriel pour créer une application d'actualités, je reçois des données de newapi, mon code est le même que dans le tutoriel, mais après avoir mis à jour l'état (this.state.articles), mon composant ne le fait pas changement. J'ai utilisé la fonction setState, j'ai essayé d'enregistrer l'état dans la console, l'état semblait correct après la mise à jour, la méthode de rendu s'est exécutée, mais rien n'a changé, quelque chose s'est peut-être mal passé

Mon code/composant

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粉384679266P粉384679266515 Il y a quelques jours684

répondre à tous(2)je répondrai

  • P粉724737511

    P粉7247375112023-09-12 17:52:54

    Salut @Curious, votre code est correct

    Faites attention lors de la préparationmap

    Vous utilisez this.articles, qui est une liste fixe (simulée)

    Vous devez appeler this.state.articles中调用map dans this.state.articles car c'est l'état que vous avez modifié dans didMount

    répondre
    0
  • P粉311464935

    P粉3114649352023-09-12 16:04:16

    this.articlesthis.state.articles Pas pareil.

    Vous disposez d'une propriété statique this.articles,你在渲染逻辑中使用了它 - this.articles.map(.... Votre récupération met à jour son statut (fonctionnement normal).

    Mettez à jour votre logique de rendu pour lire les données de this.state.articles et cela devrait alors fonctionner.

    répondre
    0
  • Annulerrépondre