reactjs - React hook useState 没有正确映射数组对象
问题描述
我有一个将对象数组传递给另一个 React 功能组件的表单:
import React, { useState } from 'react'
import uuid from 'uuid/v1';
const NewMovieForm = ( {addMovie }) => {
const movies = [
{title: 'Generic Action Movie', director: 'Some Guy', id: uuid()},
{title: 'Jumpscare Horror Flick', director: 'Some Guy', id: uuid()},
{title: 'Romantic Comedy Drama', director: 'Some Guy', id: uuid()},
]
const handleSubmit = (e) => {
e.preventDefault();
addMovie(movies);
}
return (
<form onSubmit={handleSubmit}>
<input type="submit" value="add movie" />
</form>
)
}
export default NewMovieForm
其他功能组件:
const SearchAPIResults = () => {
const [movieList, setMovies] = useState([
{ title: 'Weird Space Movie', director: 'Some Guy', id: 1},
{ title: 'Random Comedy', director: 'Some Guy',id: 2},
{ title: 'Thriller With Nick Cage', director: 'Some Guy',id: 3}
])
const addMovie = (movies) => {
movies.forEach(movie => {
console.log(movie)
setMovies([...movieList, {title: movie.title, director: movie.director, id: movie.id}])
console.log(movieList)
})
}
return (
<div>
<ul>
{movieList.map(movie => {
return (<li key={movie.id}>{movie.title}</li>)
})}
</ul>
<NewMovieForm addMovie={addMovie} />
</div>
)
}
export default SearchAPIResults;
当我按下组件submit
中的按钮时,NewMovieForm
只有{title: 'Romantic Comedy Drama', director: 'Some Guy', id: uuid()},
对象被添加到浏览器中显示的电影列表中。输出正确的console.log(movie);
电影对象,但输出数组console.log(movieList)
中的原始 3 个对象。movieList
解决方案
setMovies([...movieList, {title: movie.title, director: movie.director, id: movie.id}])
每次调用它时,您都会重置回存储在 中的任何内容movieList
,再加上一部额外的电影。因此,由于您连续执行了 3 次,因此您最终得到了原始列表以及最后一部电影。
如果需要在旧状态的基础上创建新状态,则应使用 setMovies 的回调版本。这可以保证您始终使用最新版本:
setMovies(previous => [...previous, {title: movie.title, director: movie.director, id: movie.id}])
不过,在您的情况下,我将摆脱对 setMovies 的多次调用,而只使用一个:
const addMovie = (movies => {
setMovies(previous => [...previous, ...movies]);
}
推荐阅读
- python - python字符串和正则表达式中斜线的使用
- javascript - 尝试在我的应用程序的某个字段中显示呈现的 html,但是它显示了源代码
- javascript - 内存在 Javascript 中是如何在低级别工作的?
- singularity-container - 错误:具有 Singularity 容器的容器中不存在基本主目录
- filtering - 银条 $Children.Filter
- networking - 为什么 OpenFlow 会选择优先级较低的规则?
- node.js - Google App Engine 502 错误:服务器错误 Node.js
- android - 在文件“/activity_login.xml”DataBinding 中发现重复的类,未生成 BR
- triggers - 我的触发器语法有什么问题?
- java - 余数为 0 的 Java 评分计算器