Je travaille sur un projet de location de films appelé MoVid, qui est en React et JavaScript. Voici mon code:
App.js
import * as genresAPI from "./fakeGenreService"; const movies = [ { _id: "5b21ca3eeb7f6fbccd471815", title: "Terminator", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, numberInStock: 6, dailyRentalRate: 2.5, publishDate: "2018-01-03T19:04:28.809Z" }, { _id: "5b21ca3eeb7f6fbccd471816", title: "Die Hard", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, numberInStock: 5, dailyRentalRate: 2.5 }, { _id: "5b21ca3eeb7f6fbccd471817", title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" }, numberInStock: 8, dailyRentalRate: 3.5 }]; export function getMovies() { return movies; } export function getMovie(id) { return movies.find(m => m._id === id); } export function saveMovie(movie) { let movieInDb = movies.find(m => m._id === movie._id) || {}; movieInDb.name = movie.name; movieInDb.genre = genresAPI.genres.find(g => g._id === movie.genreId); movieInDb.numberInStock = movie.numberInStock; movieInDb.dailyRentalRate = movie.dailyRentalRate; if (!movieInDb._id) { movieInDb._id = Date.now(); movies.push(movieInDb); } return movieInDb; } export function deleteMovie(id) { let movieInDb = movies.find(m => m._id === id); movies.splice(movies.indexOf(movieInDb), 1); return movieInDb; }
Movie.jsx
export const genres = [ { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, { _id: "5b21ca3eeb7f6fbccd471814", name: "Comedy" }, { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" } ]; export function getGenres() { return genres.filter(g => g); }
fakeGenreService.js
import React, { Component } from "react"; import { getMovies } from "../services/fakeMovieService"; class Movies extends Component { state = {}; render() { return ( <table className="table"> <thead> <tr> <th>Title</th> <th>Genre</th> <th>Stock</th> <th>Rate</th> </tr> </thead> <tbody> {this.state.movies.map(movie => ( <tr> <td>{movie.title}</td> <td>{movie.genre.name}</td> <td>{movie.numberInStock}</td> <td>{movie.dailyRentalRate}</td> </tr> ))} </tbody> </table> ); } } export default Movies;
fakeMovieService.js
import React, { Component } from "react"; import Movies from "./components/movies"; import "./App.css"; function App() { return ( <main className="container"> <Movies></Movies> </main> ); } export default App;
J'ai regardé:
Code de réaction lançant «TypeError: this.props.data.map n'est pas une fonction»
React JS - Uncaught TypeError: this.props.data.map n'est pas une fonction
Mais ils n'aident pas.
Les 3 autres fichiers de code sont ici . Si vous avez besoin de plus d'informations ou de code, veuillez me demander! Merci d'avance!
5 Réponses :
Vous n'avez aucun film dans votre état depuis le début. Initialisez un tableau à l'intérieur du constructeur:
state = { movies: [], };
this.state.movies n'est pas un tableau. C'est indéfini.
Si ce cas, l'erreur doit être can not read property map of undefined
, pas la map is not a function
Dans l' state
du Movie Component
, vous devez ajouter un tableau de movies
comme
<tbody> {this.state.movies.map(movie => ( <tr> <td>{movie.title}</td> <td>{movie.genre.name}</td> <td>{movie.numberInStock}</td> <td>{movie.dailyRentalRate}</td> </tr> ))} </tbody>
puis mettez à jour l'état des films. Après cela, vous pouvez mapper le tableau des movies
comme ceci
state = { movies:[] };
J'ai exécuté votre code et l'erreur que vous avez obtenue est Cannot read property 'map' of undefined
.
Premièrement, vous n'utilisez getMovies
nulle part, vos données de films ne sont pas disponibles dans le composant Movies
Deuxièmement, vous devez initialiser les films en tant que tableau vide.
Le code de votre composant Movies
doit ressembler à ceci:
import React, { Component } from "react"; import { getMovies } from "../services/fakeMovieService"; class Movies extends Component { state = { movies: [] }; componentDidMount() { this.setState({ movies: getMovies() }); } render() { return ( <table className="table"> <thead> <tr> <th>Title</th> <th>Genre</th> <th>Stock</th> <th>Rate</th> </tr> </thead> <tbody> {this.state.movies.map(movie => ( <tr> <td>{movie.title}</td> <td>{movie.genre.name}</td> <td>{movie.numberInStock}</td> <td>{movie.dailyRentalRate}</td> </tr> ))} </tbody> </table> ); } } export default Movies;
Je travaillais sur le même projet, on dirait qu'il vous manquait des crochets dans la fonction de pagination de la méthode de valeur:
const startIndex = (pageNumber-1) * pageSize; return _(items) .slice(startIndex) .take(pageSize) .value();
Veuillez ajouter votre code à l'endroit où vous obtenez les données des films et attribuez-lui le
this.state.movies
@thelonglqd J'ai ajouté le lien vers Trello pour les 3 autres fichiers.
Dans le composant
Movie
, vous n'avez utiliségetMovies
nulle part?