J'essaie de rendre une liste de films à partir d'un objet de tableau dans un format de table html. Je reçois cet avertissement:
Attention: les fonctions ne sont pas valides en tant qu'enfant React. Cela peut se produire si vous renvoyez un composant au lieu d'un rendu. Ou peut-être avez-vous voulu appeler cette fonction plutôt que la renvoyer.
import React from 'react'; import {movies} from '../services/fakeMovieService'; class Movies extends React.Component { constructor(props) { super(props); this.tableFormat = this.tableFormat.bind(this); } tableFormat() { movies.map((movie) => { return ( <tr> <td key={movie._id}>{movie.title}</td> </tr> ); }); } render() { return ( <table className="table"> <thead> <tr> <th>Title</th> <th>Genre</th> <th>Stock</th> <th>Rate</th> </tr> </thead> <tbody> {this.tableFormat()} </tbody> </table> ); } } export default Movies;
3 Réponses :
Veuillez exécuter la fonction comme suit:
<tbody> {this.tableformatter()} </tbody>
Vous avez oublié d'appeler votre fonction.
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.5.1/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.5.1/umd/react-dom.production.min.js"></script> <div id='root'>
Mais même en faisant, je ne pense pas que le résultat sera ce que vous attendez.
Pour le rendu un tableau d'éléments dans React, vous devez utiliser la fonction map
comme dit dans la documentation .
Le résultat suivant serait:
const movies = [ { title: "Spooky", genre: 'eziojgf', stock: 'nope', rate: 87 }, { title: "Sharknado", genre: 'shitty', stock: 'yes', }, { title: "haha yes" }, { title: "uhmmmm", rate: -5 } ] class Movies extends React.Component { constructor(props) { super(props); } render() { return ( <table className="table"> <thead> <tr> <th>Title</th> <th>Genre</th> <th>Stock</th> <th>Rate</th> </tr> </thead> <tbody> {movies.map(movie => <tr key={movie.title}> {['title', 'genre', 'stock', 'rate'].map(category => <td key={category}>{movie[category]}</td>)} </tr> )} </tbody> </table> ); } } ReactDOM.render(<Movies />, document.getElementById("root"));
EDIT:
I a fait une faute de frappe et mettez films
au lieu de movie
.
Le code suivant devrait faire tout ce que vous recherchez en utilisant map
et conditions en ligne:
<tbody> {movies.map(movie => <tr key={movie.title}> <td>{movie.title}</td> </tr> )} </tbody>
<tbody> {this.tableformatter()} </tbody>
Voici mon nouveau code. J'ai suivi nos conseils mais les films ne s'affichent pas. Il n'y a pas non plus d'erreur dans la console. Qu'est-ce que je rate?
À quoi ressemble votre objet movies
?
Comment puis-je coller mon nouveau code dans les commentaires? Désolé, je suis nouveau sur Stackoverflow
Vous pouvez modifier votre réponse. La lecture du code dans un commentaire est assez difficile, sauf s'il s'agit simplement d'un nom de variable. Depuis que j'ai un clavier français, j'imprime des graduations avec alt gr
+ 7
J'ai modifié le code de ma question. Bien vouloir vérifier.
voici la bonne façon de résoudre ce problème avec React
function TableFormatter ({title /* , and other props genre, rate etc. *//}) { return ( <tr> <td>{title}</td> {/* you may want to add other td here *//} </tr> ) } function Table({movies}) { render() { return ( <table className="table"> <thead> <tr> <th>Title</th> <th>Genre</th> <th>Stock</th> <th>Rate</th> </tr> </thead> <tbody> {movies.map(movie => <TableFormatter key={movie.id} {...movie} />)} </tbody> </table> ); } }
Voici mon nouveau code: