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
.
3 Réponses :
Dans la méthode de rendu de votre application, mettez ceci au début:
if (!this.state.trails.length) { return <div>Loading...</div>; }
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.
Merci! Cela a résolu tous les avertissements PropType que j'avais.
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 à
{Object.keys(trails).map((key) => ( <TrailItem key={key} trail={trails[key]} /> ))}
this.props.trails [key]
est un tableau, mais vous l'avez apparemment marqué comme un objet dans les types de propTrailItem
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'}
puisfoo ['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 depropTypes
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 (@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) code> 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 () code> sur cela sans obtenir une erreur. Quand j'essaie, je reçois traces.map () n'est pas une fonction i>
Désolé pour le mauvais formatage de tout le monde. Je ne sais pas comment faire du code multiligne dans ces commentaires.