[英]how to render different component on the same page
I have a simple react movies app, search bar component for searching a specific movie and main content component that shows popular movies.我有一个简单的反应电影应用程序,用于搜索特定电影的搜索栏组件和显示热门电影的主要内容组件。
when a user search for a specific movie the movie is displayed under the search bar component and I want that the movie will be displayed instead of the main content component, I try to do it with useState but got nothing当用户搜索特定电影时,该电影显示在搜索栏组件下,并且我希望显示该电影而不是主要内容组件,我尝试使用 useState 执行此操作,但一无所获
here is my code:这是我的代码:
import React from 'react'
import MainContent from '../../component/MainContent/MainContent'
import SearchBar from '../../component/SearchBar/SearchBar'
export default function HomePage() {
return (
<div>
<SearchBar />
<MainContent />
</div>
)
}
import React, { useState, useEffect } from 'react';
import Slider from "react-slick";
import Loading from '../Loading';
import './mainContent.css';
import MovieCard from '../MovieCard/MovieCard';
export default function MainContent() {
const [allMovies, setAllMovies] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const moviesDisplay = async () => {
try {
setIsLoading(true);
const api_url = 'http://localhost:4000/movies';
await fetch(api_url)
.then(res => res.json())
.then(results => {
// console.log(results.results)
setAllMovies(results.results)
})
} catch (err) {
console.error('failed to fetch');
} finally {
setIsLoading(false);
}
}
useEffect(() => {
moviesDisplay();
}, []);
const settings = {
infinite: true,
slidesToShow: 5,
slidesToScroll: 2,
arrows: true,
autoplay: true,
autoplaySpeed: 3000,
pauseOnHover: true,
responsive: [
{
breakpoint: 1024,
settings: {
slidesToShow: 4,
slidesToScroll: 4,
infinite: true,
}
}, {
breakpoint: 800,
settings: {
slidesToShow: 3,
slidesToScroll: 3,
initialSlide: 1
}
},
{
breakpoint: 600,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
initialSlide: 2
}
},
{
breakpoint: 480,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
]
};
return (
<div className='moviesContainer'>
<div className='moviesCarousel'>
{isLoading && <Loading />}
<Slider {...settings}>
{allMovies && allMovies.filter(movie => movie.poster_path).map((movie) =>
<div className="movieCard" key={movie.id}>
<MovieCard poster_path={'https://image.tmdb.org/t/p/w300' + movie.poster_path} title={movie.title}
release_date={movie.release_date} vote_average={movie.vote_average} overview={movie.overview} />
</div>
)}
</Slider>
</div>
</div>
)
}
import React, { useEffect, useState } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import Loading from '../Loading';
import MovieCard from '../MovieCard/MovieCard';
import './searchBar.css';
export default function SearchBar(props) {
const [movies, setMovies] = useState([]);
const [query, setQuery] = useState('');
const [isLoading, setIsLoading] = useState(false)
const movieSearch = async (API) => {
setIsLoading(true);
await fetch(API)
.then((res) => res.json())
.then((data) => {
setMovies(data.results[0])
setIsLoading(false)
});
}
const handleSubmit = (e) => {
console.log(query)
if (query !== '') {
movieSearch(
`http://localhost:4000/movie/${query}`
)
setQuery('')
}
e.preventDefault()
}
const handleChange = (e) => {
setQuery(e.target.value)
}
return (
<>
<div className='searchMovieInput'>
<form onSubmit={handleSubmit}>
<input type="text" placeholder="Search.." value={query} onChange={handleChange} />
<button type="submit"><FontAwesomeIcon icon='search' size='lg' color='chocolate' /></button>
</form>
{isLoading && <Loading />}
<div className="movie-card">
<MovieCard poster_path={movies.poster_path} {...movies} key={movies.id} />
</div>
</div>
</>
)
}
You need share state between components SearchBar and MainContent.您需要在组件 SearchBar 和 MainContent 之间共享 state。 I know how to do this with Context or State management like redux, Mobx我知道如何使用 Context 或 State 管理来做到这一点,例如 redux、Mobx
import React from "react";
const Context = React.createContext({
visibleMainContent: true,
setVisibleMainContent: () => {},
});
const SearchBar = (props) => {
const {visibleMainContent, setVisibleMainContent} = React.useContext(Context)
return <div>
<button onClick={()=> setVisibleMainContent(!visibleMainContent)}>{visibleMainContent ? "Hide" : "Show"}</button>
</div>;
};
const MainContent = (props) => {
const {visibleMainContent} = React.useContext(Context)
return <div style={{display: visibleMainContent ? "block" : "none"}}>Main Content</div>;
};
export default function App () {
const [visibleMainContent, setVisibleMainContent] = React.useState("en");
const visibleMC = { visibleMainContent, setVisibleMainContent };
return (
<Context.Provider value={visibleMC} >
<div>
<SearchBar />
<MainContent />
</div>
</Context.Provider>
);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.