我一直在为这段代码而挣扎,我想是按下了一个按钮,表将在显示所有项目和显示赢家项目之间切换。
问题:必须点击两次按钮才能显示获胜者的项目。无法恢复到显示全部。
如果有人能帮上忙的话,一定要感激。非常感谢。
const MovieList = () => {
// Get Movies
const [movies, setMovies] = useState([])
const [winner, filterWinner] = useState(false)
const fetchMovies = async () => {
const res = await fetch('http://localhost:5000/data')
const data = await res.json()
return data
}
useEffect(() => {
const getMovies = async () => {
const moviesFromServer = await fetchMovies()
setMovies(moviesFromServer)
}
getMovies()
}, [])
//toggle between setting movies to all movies and winner movies.
//movie is an object that has a key and value pair "winner" : "True" or "winner" : "False"
const toggleWinner = () => {
filterWinner(!winner)
if (winner === true) {
const winners = movies.filter((movie) => movie.winner === 'True');
setMovies(winners);
} else {
setMovies(movies);
}
}
return (
<div className="container">
<h1>Movies</h1>
<hr />
<div>
<Button onClick={toggleWinner} color="info">{winner ? "Show All" : "Show Winners"}</Button>
</div>
<div>
<table className="table table-bordered table-striped">
<thead className="thead-dark">
<tr>
<th>Year</th>
<th>Film Name</th>
<th>Oscar Winner</th>
<th>Country</th>
</tr>
</thead>
<tbody>
{movies.map(movie => (
<tr key={movie.id}>
<td>{movie.year}</td>
<td>{movie.filmName}</td>
<td>{movie.winner}</td>
<td>{movie.country}</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
)
}
export default MovieList;
发布于 2021-10-05 17:34:25
这里的问题是,当您设置状态时,该状态不会立即更新,因此不能将winner
与true
进行比较。
您可以尝试这种方法。
const toggleWinner = () => {
//winner = false
filterWinner(prev => {
if(!prev) { // winner = true
const winners = movies.filter((movie) => movie.winner === "True");
setMovies(winners);
}
else {
setMovies(movies);
}
return !prev
});
};
另一个问题是您改变了movies
,所以当您再次切换时,旧的movies
值就消失了。
检查这个代码框,看看我是如何修复的:https://codesandbox.io/s/frosty-browser-o8jeb?file=/src/App.js
发布于 2021-10-05 18:28:20
如果状态更改取决于以前的状态值,则需要在update函数中调用函数。
const状态,setState=useState(false);
如果您想切换状态值,需要像这样调用update函数。
setState(state=>!state)
在你的情况下
filterWinner(winner=>!赢家)
注意:您可以在update函数中使用任何您想要的名称作为参数。
https://stackoverflow.com/questions/69458642
复制