reactjs - 如何将本地 JSON 数据设置为 React 中的功能组件?
问题描述
我是新来的反应。我被困在这里了。我不确定如何将作为函数返回的 json 数据传递给 useState。我使用了类,一切都运行良好。现在我正在尝试将该代码转换为功能组件。当我删除一个项目时,它会显示一个错误。movie.filter 不是函数。
index.js
import React, { Component,useState } from 'react'
import {getMovies} from "../services/fakeMovieService"
function Movies() {
const movies = getMovies()
const [movie, setMovie] = useState(movies);
const handleDelete = (movie) => {
const newM= movie.filter(m => m._id != movie._id)
setMovie({newM})
}
return (
<React.Fragment>
<table className="table">
<thead>
<tr>
<th>Title</th>
</tr>
</thead>
<tbody>
{movie.map(movie =>(
<tr key={movie._id}>
<td>{movie.title}</td>
<td>{movie.genre.name}</td>
<td>{movie.numberInStock}</td>
<td>{movie.dailyRentalRate}</td>
<td><button onClick={()=>handleDelete(movie)} className="btn btn-danger btn-sm">Delete</button></td>
</tr>
))
}
</tbody>
</table>
</React.Fragment>
);
}
export default Movies;
JSON
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
},
{
_id: "5b21ca3eeb7f6fbccd471819",
title: "Trip to Italy",
genre: { _id: "5b21ca3eeb7f6fbccd471814", name: "Comedy" },
numberInStock: 7,
dailyRentalRate: 3.5
},
{
_id: "5b21ca3eeb7f6fbccd47181a",
title: "Airplane",
genre: { _id: "5b21ca3eeb7f6fbccd471814", name: "Comedy" },
numberInStock: 7,
dailyRentalRate: 3.5
},
{
_id: "5b21ca3eeb7f6fbccd47181b",
title: "Wedding Crashers",
genre: { _id: "5b21ca3eeb7f6fbccd471814", name: "Comedy" },
numberInStock: 7,
dailyRentalRate: 3.5
},
{
_id: "5b21ca3eeb7f6fbccd47181e",
title: "Gone Girl",
genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" },
numberInStock: 7,
dailyRentalRate: 4.5
},
{
_id: "5b21ca3eeb7f6fbccd47181f",
title: "The Sixth Sense",
genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" },
numberInStock: 4,
dailyRentalRate: 3.5
},
{
_id: "5b21ca3eeb7f6fbccd471821",
title: "The Avengers",
genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" },
numberInStock: 7,
dailyRentalRate: 3.5
}
];
export function getMovies() {
return movies;
}
解决方案
setMovie({newM})
应该
setMovie(newM)
因为你的状态是一个数组。参数movie
和状态movie
具有相同的名称,因此您尝试Array.prototype.filter
在对象上使用。
将重组后的数组值重命名为useState
tomovies
和setMovies
:
const initialMovies = getMovies()
const [movies, setMovies] = useState(initialMovies);
使用功能状态更新,因为新状态依赖于旧状态:
const handleDelete = (movie) => {
setMovies(previousMovies => previousMovies.filter(m => m._id !== movie._id))
}
并用于movies
渲染
{movies.map(movie => (...
推荐阅读
- php - 每次我重新加载我的网站时,它都会在我的 JSON 文件中添加一个新用户?我怎样才能防止这种情况?
- python - 我找不到正确循环这个刽子手代码的方法
- c# - 获取经过身份验证的用户的全名
- php - while 循环从数字 934 中减去 6.3,直到数字 * 介于(不等于)47 和 57 之间
- ruby-on-rails - 如何在邮件程序中使用模板变量
- bash - 如何将多行查询结果存储在bash变量中
- javascript - “错误:节点不可见或不是 HTMLElement”。傀儡师
- c - 如果变量没有初始化,为什么这段 C 代码编译和执行要花这么长时间?
- javascript - 替换除数字、冒号和换行之外的所有内容
- flutter - 如何使用 shared_preferences 库实现 Flutter Riverpod FutureProvider?