我目前正在构建一个应用程序,用户可以在其中搜索广泛的电影选择,然后可以选择在收藏页面中收藏它们。
目前,我已经设法在按下收藏按钮后建立了一个电影数组,但不能将它们推到收藏夹的下一页。
我将感谢任何提示和技巧沿着解决这个问题的方式!
App.js
import React from "react";
import Header from "./Header";
import {Route, Routes} from 'react-router-dom'
import Favourites from "./views/Favourites";
import Home from "./views/Home";
import About from "./views/About";
function App() {
return (
<>
<Header />
<div>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/favourites" element={<Favourites />} />
<Route path="/about" element={<About />} />
</Routes>
</div>
</>
)
}
export default App;
Home.js
import React, { useState, useEffect } from 'react';
import SearchField from '../components/SearchField';
import MovieList from '../components/MovieList';
const Home = () => {
const [movies, setMovies] = useState([]);
const [searchInput, setSearchInput] = useState ('')
const [favouriteMovies, setFavouriteMovies] = useState([])
const handleFavourites = (movie) => {
favouriteMovies.push(movie)
console.log(favouriteMovies)
}
const getMovies = async (searchInput) => {
const url = `http://www.omdbapi.com/?s=${searchInput}&apikey=87aa1413`;
const res = await fetch(url);
const resJson = await res.json();
if (resJson.Search){
setMovies(resJson.Search)
} else {
}
};
useEffect(() => {
getMovies(searchInput);
}, [searchInput]);
return (
<>
<SearchField searchInput={searchInput} setSearchInput={setSearchInput} />
<MovieList movies = {movies} handleFavourites = {handleFavourites}
setFavouriteMovies = {setFavouriteMovies}/>
</>
)
}
export default Home;
Favourites.js
import React from "react"
const Favourites = () => {
return (
<>
<h1>Favourites</h1>
</>
)
}
export default Favourites;
除非您使用API或后端来存储收藏夹,否则如果您仅依赖于状态,这将是不可能的。
因为组件状态会在卸载后立即被清除。
如果你的应用程序是纯粹的前端,你可以将数据存储在用户的浏览器中,我建议使用localStorage
我建议您将收藏的电影推送到localStorage。通过这样做,您可以在收藏夹页面上使用该数据,当用户关闭浏览器并再次返回时,他仍然会保存他选择的电影。
使用上下文也将允许您通过组件传递数据,但它将在用户离开网站后被清除。
如果您使用Link
或history
切换到另一条路由,您可以通过在URL中不可见但可从目标路由访问的state
。
在你的Home.js
中,你可以添加一个按钮,例如:
const history = useHistory();
...
// Within returned tree, add a button:
<button onClick={() => {history.push('/favourites', {movies: favouriteMovies});}}>
Go to favourites
</button>
// or simply a link (don't need history in this case):
<Link to={{pathname: "/favourites", state: {movies: favouriteMovies}}}>
Go to favourites
</Link>
然后,在Favourites.js
中,通过:
const {state} = useLocation();
const movies = state.movies;