0
votes

Comment extraire des données spécifiques d'une API à l'aide de l'URL

C'est probablement une solution facile mais je ne peux pas voir la solution. Mon projet sur lequel j'ai pris beaucoup trop de temps commence enfin à se fermer, mais je suis vers la toute fin et j'ai des problèmes avec l'API avec laquelle je travaille.

Je m'attends à ce que chaque fois que j'utilise ma correspondance dans HeroDetail, je puisse utiliser cet identifiant pour localiser les données du héros que je veux afficher chaque fois que vous cliquez dessus. Mes autres composants fonctionnent exactement comme je pense qu'ils devraient. Ils me dirigent vers ma page HeroDetail avec un identifiant spécifique à un héros sur lequel je clique.

Le problème que j'ai, c'est qu'avec cette API, je ne sais pas comment utiliser cet identifiant pour extraire les heroStats de cet identifiant spécifique.

J'ai pensé que je pourrais peut-être ajouter quelques paramètres à la fin de l'url, comme ? _id = $ {} , mais cela n'a pas abouti. L'URL de l'API est https://docs.opendota.com/#section/Introduction si vous voulez aussi en lire un peu plus. Je n'ai rien trouvé qui puisse m'aider.

import React, {useState, useEffect} from "react";
import "./App.css";


function HeroDetail({match}) {

    useEffect(() => {
        fetchHero();
        console.log(match)
    },[]);

    const [item, setItem] = useState([]);

    const fetchHero = async () => {
        const fetchHero = await fetch(`https://api.opendota.com/api/heroStats}`);
        const item = await fetchHero.json();
        setItem(item);
        console.log(item)
    };
    return(
        <div>
           <h1>{item.id} </h1>
        </div>
    );
}

export default HeroDetail;


8 commentaires

Pouvez-vous essayer const hero = item.find (h => h.id === / * l'id du héros que vous voulez * /)


const hero = item.find (h => h.id === match.params.id) me donne undefined


Y a-t-il un héros avec l'id match.params.id dans les données que vous obtenez de fetch () ?


Non, j'ai une liste et elle est créée dynamiquement. Disons que je sélectionne le 4 héros, puis mon URL sera http: // localhost: 3000 / select / 4 et j'essaye d'utiliser ce 4 pour trouver le héros dans heroStats, en utilisant l'API


Si vous avez copié-collé l'extrait de code ci-dessus à partir de votre code de production, il peut être intéressant de noter qu'il y a un «}» à la fin de votre URL de récupération.


@Nitin qui a été corrigé désolé


L'approche de Tim devrait vous donner le bon héros. Pouvez-vous confirmer que le type de match.params.id est bien un nombre et non une chaîne?


Salut @ 4156, j'ai ajouté un lien vers une boîte de code dans une réponse avec un exemple fonctionnel pour vous :)


3 Réponses :


0
votes

Opendota ne fournit pas d'API pour récupérer HeroStat par identifiant. Mais vous ne pouvez récupérer les HeroStats qu'une seule fois. Stockez-les dans votre boutique (si vous utilisez Redux). Utilisez le filtre de find pour obtenir le heroStat exact avec votre identifiant. En outre, vous pouvez utiliser reselect pour créer des sélecteurs mémorisés.


0 commentaires

-1
votes

En tant que document API, nous pouvons voir qu'il donnera un tableau d'objets.

[ { "id": 0, "nom": "chaîne", "nom_localisé": "chaîne", "img": "chaîne", "icon": "string", "pro_win": 0, "pro_pick": 0, "hero_id": 0, "pro_ban": 0, "1_pick": 0, "1_win": 0, "2_pick": 0, "2_win": 0, "3_pick": 0, "3_win": 0, "4_pick": 0, "4_win": 0, "5_pick": 0, "5_win": 0, "6_pick": 0, "6_win": 0, "7_pick": 0, "7_win": 0 } ]

Donc, si vous souhaitez accéder à l'identifiant, dans votre cas, item [0] .id fonctionnera, ou vous pouvez utiliser find

const found = item.find (element => element.id == 'quel que soit l'id');

console.log (trouvé);


0 commentaires

2
votes

J'ai créé un petit CodeSandBox qui a un exemple fonctionnel de ce dont je parlais dans les commentaires de l'OP.

https://codesandbox.io/s/silent -leftpad-cbjb3? fontsize = 14 & hidenavigation = 1 & theme = dark


10 commentaires

const heroId = match.params.id; const hero = item.find (element => element.id === heroId); console.log (hero); me donne toujours undefined


match.params.id est-il indéfini?


Non, j'ai un autre composant qui mappe tous les héros et la clé est leur identifiant, une fois que je clique sur le héros que je veux choisir, il ajoute cet identifiant à l'url et c'est ce que retourne match.params.id. Donc, dans ce cas, j'ai sélectionné Bloodseeker et 4 a été retourné


github.com/kevin6767/api_search Si vous souhaitez tout vérifier


Il n'y a pas de package.json?


Je viens de l'ajouter de ma faute


Sans rapport, mais étant donné que vous récupérez déjà cette route d'API dans le composant parent, vous pouvez aussi bien transmettre les données au lieu de les récupérer


Ah, solution simple, heroId doit être de type Number const hero = item.find (element => element.id === Number (heroId)) ;


N'oubliez pas non plus de mettre à jour hero / setItem après .find le héros


continuons cette discussion dans le chat .