J'ai reçu cette erreur
TypeError: Impossible de lire la propriété 'map' d'undefined`
L'objet DISHES
est importé de plats.js et chargé dans les plats d'objet d'état dans le composant App.js , puis il est passé comme accessoire à MenuComponent.js via le composant Menu lorsqu'il est rendu dans App.js^
Je ne sais pas pourquoi, tout semble correct, il s'agit d'un devoir qui fait partie d'un cours en ligne et j'ai vu des corrections apportées par d'autres personnes qui ont suivi le cours et elles semblent faire exactement la même chose que moi et cela fonctionne pour elles.
Sortie
App.js
XXX
MenuComponent.js
export const DISHES = [ { id: 0, name:'Uthappizza', image: 'assets/images/uthappizza.png', category: 'mains', label:'Hot', price:'4.99', description:'A unique combination of Indian Uthappam (pancake) and Italian pizza, topped with Cerignola olives, ripe vine cherry tomatoes, Vidalia onion, Guntur chillies and Buffalo Paneer.', comments: [ { id: 0, rating: 5, comment: "Imagine all the eatables, living in conFusion!", author: "John Lemon", date: "2012-10-16T17:57:28.556094Z" }, { id: 1, rating: 4, comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", author: "Paul McVites", date: "2014-09-05T17:57:28.556094Z" }, { id: 2, rating: 3, comment: "Eat it, just eat it!", author: "Michael Jaikishan", date: "2015-02-13T17:57:28.556094Z" }, { id: 3, rating: 4, comment: "Ultimate, Reaching for the stars!", author: "Ringo Starry", date: "2013-12-02T17:57:28.556094Z" }, { id: 4, rating: 2, comment: "It's your birthday, we're gonna party!", author: "25 Cent", date: "2011-12-02T17:57:28.556094Z" } ] }, { id: 1, name:'Zucchipakoda', image: 'assets/images/zucchipakoda.png', category: 'appetizer', label:'', price:'1.99', description:'Deep fried Zucchini coated with mildly spiced Chickpea flour batter accompanied with a sweet-tangy tamarind sauce', comments: [ { id: 0, rating: 5, comment: "Imagine all the eatables, living in conFusion!", author: "John Lemon", date: "2012-10-16T17:57:28.556094Z" }, { id: 1, rating: 4, comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", author: "Paul McVites", date: "2014-09-05T17:57:28.556094Z" }, { id: 2, rating: 3, comment: "Eat it, just eat it!", author: "Michael Jaikishan", date: "2015-02-13T17:57:28.556094Z" }, { id: 3, rating: 4, comment: "Ultimate, Reaching for the stars!", author: "Ringo Starry", date: "2013-12-02T17:57:28.556094Z" }, { id: 4, rating: 2, comment: "It's your birthday, we're gonna party!", author: "25 Cent", date: "2011-12-02T17:57:28.556094Z" } ] }, { id: 2, name:'Vadonut', image: 'assets/images/vadonut.png', category: 'appetizer', label:'New', price:'1.99', description:'A quintessential ConFusion experience, is it a vada or is it a donut?', comments: [ { id: 0, rating: 5, comment: "Imagine all the eatables, living in conFusion!", author: "John Lemon", date: "2012-10-16T17:57:28.556094Z" }, { id: 1, rating: 4, comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", author: "Paul McVites", date: "2014-09-05T17:57:28.556094Z" }, { id: 2, rating: 3, comment: "Eat it, just eat it!", author: "Michael Jaikishan", date: "2015-02-13T17:57:28.556094Z" }, { id: 3, rating: 4, comment: "Ultimate, Reaching for the stars!", author: "Ringo Starry", date: "2013-12-02T17:57:28.556094Z" }, { id: 4, rating: 2, comment: "It's your birthday, we're gonna party!", author: "25 Cent", date: "2011-12-02T17:57:28.556094Z" } ] }, { id: 3, name:'ElaiCheese Cake', image: 'assets/images/elaicheesecake.png', category: 'dessert', label:'', price:'2.99', description:'A delectable, semi-sweet New York Style Cheese Cake, with Graham cracker crust and spiced with Indian cardamoms', comments: [ { id: 0, rating: 5, comment: "Imagine all the eatables, living in conFusion!", author: "John Lemon", date: "2012-10-16T17:57:28.556094Z" }, { id: 1, rating: 4, comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", author: "Paul McVites", date: "2014-09-05T17:57:28.556094Z" }, { id: 2, rating: 3, comment: "Eat it, just eat it!", author: "Michael Jaikishan", date: "2015-02-13T17:57:28.556094Z" }, { id: 3, rating: 4, comment: "Ultimate, Reaching for the stars!", author: "Ringo Starry", date: "2013-12-02T17:57:28.556094Z" }, { id: 4, rating: 2, comment: "It's your birthday, we're gonna party!", author: "25 Cent", date: "2011-12-02T17:57:28.556094Z" } ] } ];
plats.js
XXX
3 Réponses :
Pour éviter toute valeur non définie des accessoires, vous pouvez utiliser la bibliothèque prop-types , où vous définissez les valeurs par défaut de vos accessoires, de sorte que si la valeur des accessoires n'est pas transférée vers votre composant, votre composant aura toujours une valeur par défaut pour se comporter comme prévu. C'est utile dans le cas où vos accessoires ne sont pas définis d'emblée par exemple (ce qui est probablement le cas ici).
Pour ce faire, installez la bibliothèque:
// Define the props types to check Menu.propTypes = { dishes: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.number, name: PropTypes.string, image: PropTypes.string, category: PropTypes.string, label: PropTypes.string, price: PropTypes.string, description: PropTypes.string, comment: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.number, rating: PropTypes.number, comment: PropTypes.string, author: PropTypes.string, date: PropTypes.string, })), })), }; // Define here the default value to attribute to your dishes props Menu.defaultProps = { dishes: [], }; export default Menu;
Puis dans votre fichier MenuComponent
, ajoutez l'import en haut de votre fichier:
import PropTypes from 'prop-types';
et enfin, à la fin de votre fichier, ajoutez cette vérification de type d'accessoires et la valeur par défaut:
npm install --save prop-types
J'espère que cela vous aidera!
Merci pour le grand effort mais malheureusement cela n'a pas fonctionné: /
Bonjour, qu'est-ce que tu veux dire par ça n'a pas fonctionné? Qu'avez-vous essayé, quelles erreurs avez-vous eues?
Vous avez ce composant
qui attend un accessoire plats
.
Maintenant dans
, vous appelez this.setState ()
mais il est asynchrone, et sur le premier rendu de
), la valeur
this.state.dishes
est toujours indéfinie
, d'où this.props < / code> dans
est également
non défini
Lorsqu'il est mis à jour, il y a un nouveau rendu, et les
et sont rendus avec les valeurs correctes.
Vous pouvez donc ajouter une vérification pour undefined
afin que .map ()
ne s'exécute que lorsque this.props
a une valeur.
/ p>
C'est ce que fait this.props && this.props.dishes.map ()
. Essentiellement, cela signifie if (this.props) {this.props.dishes.map ()}
, donc quand this.props
est indéfini
, la deuxième expression n'est pas exécutée.
Une fois que setState
est terminé, this.props
est défini et vous obtenez votre résultat.
Je suis le même cours et j'ai copié et collé votre code sans problème. Assurez-vous que votre fichier index.js ressemble également à ceci. Si ce n'est pas le problème, vos importations ont peut-être été correctement installées. Puisqu'il y a un problème avec le MenuComponent, React n'a peut-être pas été téléchargé correctement.
Je ne sais pas quel est le problème, mais je ne pense pas que ce soit quelque chose avec le code.
import React from 'react'; import ReactDOM from 'react-dom'; import 'bootstrap/dist/css/bootstrap.min.css'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); reportWebVitals();
En vous assurant que
this.props.dishes
n'est pas indéfini, c'est-à-dire qu'il a une valeur qui est un tableauVous devez lier votre fonction
@DennisVash j'ai lié toutes les fonctions dans MenuComponent.js toujours rien
@Manish s'avère que l'objet DISHES n'est pas chargé dans l'état de plats dans App.js, y a-t-il quelque chose que je fais de mal?
Essayez de connecter
DISHES
etthis.state.dishes
pour commencerJe les ai enregistrés, ils sont chargés avec les données de plats.js
Dans votre constructeur de menu, si vous faites console.log (this.props) après super (), qu'obtenez-vous?
@AnuragSrivastava j'obtiens this.props est chargé avec succès avec le contenu de state.dishes
Pouvez-vous essayer
this.props && this.props.dishes.map ()
@AnuragSrivastava Cela a fonctionné, merci, pouvez-vous me dire quel est le && dans ce contexte, je suis assez nouveau dans reactjs, aussi ce serait cool si vous postez ceci comme une réponse afin que je puisse le marquer comme résolu