0
votes

Afficher la liste des sentiers dans React - "Avertissement: type d'hélice ayant échoué"

React Newbie

Je suis en train de coder dans React. Je prends un objet de données JSON à partir d'une requête GET vers une api et j'essaie de le transmettre comme accessoire dans un composant. Ensuite, je mappe dessus pour faire une liste d'objets "trail".

J'obtiens cette erreur dans la console: "Avertissement: Echec du type de prop: prop trail non valide de type array fourni à TrailItem , objet attendu . "

Voici le code pour mon composant au niveau de l'application:

import React from "react";
import PropTypes from "prop-types";

const TrailItem = ({ trail: { name, location, imgSmall } }) => {
  return (
    <div className='card text-center'>
      <img src={imgSmall} alt='trail' style={{ width: "25%" }} />
      <h3>{name}</h3>
      <p>{location}</p>
    </div>
  );
};

TrailItem.propTypes = {
  trail: PropTypes.array.isRequired,
};

export default TrailItem;

Pour autant que je sache, il n'y a pas de problème avec le Les données. Un console.log (res.data); renvoie un objet, donc je sais que la requête api fonctionne.

Voici le code de mon composant "Trails": p >

import React, { Component } from "react";
import TrailItem from "./TrailItem";

class Trails extends Component {
  render() {
    return (
      <div style={trailStyle}>
        {Object.keys(this.props.trails).map((key) => (
          <TrailItem key={key} trail={this.props.trails[key]} />
        ))}
      </div>
    );
  }
}

const trailStyle = {
  display: "grid",
  gridTemplateColumns: "repeat(3, 1fr)",
  gridGap: "1rem",
};

export default Trails;

J'ai l'impression que je n'utilise peut-être pas la syntaxe correcte pour entrer dans l'objet, puis plus loin dans le tableau "sentiers", mais je suis perplexe. Merci pour votre aide!

MODIFIER Voici le code "TrailItem":

import React, { Component } from "react";
import "./App.css";
import Navbar from "./components/layout/Navbar";
import Trails from "./components/trails/Trails";
import axios from "axios";

class App extends Component {
  state = {
    trails: {},
  };

  async componentDidMount() {
    const res = await axios.get(
      `https://www.hikingproject.com/data/get-trails?lat=35.0844&lon=-106.6504&maxDistance=10&key=${process.env.REACT_APP_HIKING_PROJECT_KEY}`
    );

    console.log(res.data);

    this.setState({ trails: res.data });
  }

  render() {
    return (
      <div className='App'>
        <Navbar />
        <div>
          <Trails trails={this.state.trails} />
        </div>
      </div>
    );
  }
}

export default App;

J'ai suivi les conseils de l'un des commentaires et j'ai changé le PropType en tableau, et cela a corrigé l'un des avertissements. Mais je ne parviens toujours pas à obtenir une liste de .


10 commentaires

this.props.trails [key] est un tableau, mais vous l'avez apparemment marqué comme un objet dans les types de prop TrailItem


vous avez vérifié la réponse de l'API dans la console, mais vous devez vérifier quelles données vous transmettez à TrailItems, donc si vous console ou déboguez à ce stade, vous savez quel est exactement le problème


Les propriétés @Agney Object sont accessibles de la même manière que les index de tableau, après tout, les objets JS ne sont que des tableaux associatifs de paires clé-valeur. C'EST À DIRE. foo = {bar: 'bang'} puis foo ['bar'] donne 'bang' . Maintenant, si c'est ce que signifie le PO, c'est une toute autre histoire.


Scott, pouvez-vous partager votre code TrailItem et la définition de propTypes puisque c'est là que se trouve l'avertissement de prop?


@DrewReese Je ne parle pas de la façon dont JS implémente les tableaux et les objets. Si vous définissez un proptype comme objet et fournissez un tableau, les types d'accessoires lanceraient une erreur


@Agney Je vois ce que tu dis. Ce que vous vouliez dire était un peu ambigu, car il n'y a pas de définitions de propType partagées dans la question. Je vois que vous vouliez dire que la valeur de this.props.trails [clé] est un tableau.


J'ai changé mon composant "Trails" en un composant fonctionnel et déstructuré l'objet "Trails". Quand je console.log () , j'obtiens le tableau d'objets que je veux, mais je n'arrive toujours pas à comprendre comment les cartographier. J'obtiens maintenant une erreur "TypeError: trails.map is not a function" . `const Trails = ({sentiers}) => {console.log (sentiers.trails); return (

{trails.map ((trail) => ())}
); }; ''


@Agney Merci, cela a éliminé l'avertissement. J'ai encore besoin d'obtenir le .map () pour remplir une liste de `.


@ Drewreese je pense que je suis proche ici. J'ai ajouté console.log (traces.traila) et j'obtiens enfin la matrice d'objets que je veux dans la console du navigateur. Maintenant, j'ai juste besoin de comprendre comment .map () sur cela sans obtenir une erreur. Quand j'essaie, je reçois traces.map () n'est pas une fonction


Désolé pour le mauvais formatage de tout le monde. Je ne sais pas comment faire du code multiligne dans ces commentaires.


3 Réponses :


0
votes

Dans la méthode de rendu de votre application, mettez ceci au début:

if (!this.state.trails.length) {
  return <div>Loading...</div>;
}


0 commentaires

0
votes

Vous pouvez donner à traces une valeur par défaut ou initiale d'un tableau vide afin que la fonction de carte puisse être appelée. En utilisant un tableau vide, le composant mappera sur un tableau vide et retournera un tableau vide à rendre.

Valeur par défaut:

const Trails = ({ trails = [] }) => {
  console.log(trails.trails);
  return (
    <div style={trailStyle}>
      {trails.map(trail => <TrailItem key={trail.id} trail={trail} />)} 
    </div>
  );
};

TrailItem.propTypes = {
  trail: PropTypes.array.isRequired,
};

Valeur initiale:

const Trails = ({ trails }) => {
  console.log(trails.trails);
  return (
    <div style={trailStyle}>
      {trails.map(trail => <TrailItem key={trail.id} trail={trail} />)} 
    </div>
  );
};

TrailItem.propTypes = {
  trail: PropTypes.array.isRequired,
};
TrailItem.defaultValue = {
  trail: [],
};

Remarque: Cela ne résoudra pas la transmission d'un accessoire de type incorrect, mais la réaction de validation de l'hélice le fera. Il semble que vous ayez réglé ce problème.


1 commentaires

Merci! Cela a résolu tous les avertissements PropType que j'avais.



0
votes

Je l'ai résolu! Certes, je n'ai peut-être pas été clair dans ma question initiale, mais j'ai compris pourquoi je ne pouvais pas accéder à l'objet de données à partir de l'API.

J'avais besoin de revenir dans l'objet une fois de plus après avoir reçu la réponse dans mon composant d'application: this.setState ({trails: res.data.trails});

Une fois que j'ai fait cela, dans mon composant Trails j'avais besoin de Object.key () code> pour transformer le prop "trails" en un tableau afin que je puisse .map () dessus.

Et enfin, la partie "délicate" était que je devais utiliser chaque "clé" comme index pour chaque accessoire "trail" que j'essayais de transmettre à code >:

{Object.keys(trails).map((key) => (
    <TrailItem key={key} trail={trails[key]} />
))}


0 commentaires