#javascript #html #reactjs
#javascript #HTML #reactjs
Вопрос:
В моей функции handleClick я добавляю фильм в новый массив. Тем не менее, я также хочу одновременно изменить отображаемый текст.
Например, вот моя функция, которая добавляет фильм в список наблюдения.
const addFavoriteMovie = (movie) => {
const newFavoriteList = [...favorites, movie];
setFavorites(newFavoriteList);
saveToLocalStorage(newFavoriteList);
};
И как оно возвращается:
<div className='row'>
<MovieList
movies={movies}
handleFavoritesClick={addFavoriteMovie}
favoriteComponent={AddFavorites}
/>
</div>
Вот мой компонент AddFavorites.
import React from 'react';
const AddFavorite = () => {
return(
<React.Fragment>
<div className="AddToList">
<span className='mr-2'> Add to Watchlist</span>
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart" fill="red" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M8 2.748l-.717-.737C5.6.281 2.514.878 1.4 3.053c-.523 1.023-.641 2.5.314 4.385.92 1.815 2.834 3.989 6.286 6.357 3.452-2.368 5.365-4.542 6.286-6.357.955-1.886.838-3.362.314-4.385C13.486.878 10.4.28 8.717 2.01L8 2.748zM8 15C-7.333 4.868 3.279-3.04 7.824 1.143c.06.055.119.112.176.171a3.12 3.12 0 0 1 .176-.17C12.72-3.042 23.333 4.867 8 15z"/>
</svg>
</div>
<div className="Added">
<span className='mr-2'> Added to Watchlist</span>
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z"/>
</svg>
</div>
</React.Fragment>
);
};
export default AddFavorite;
Я хочу, чтобы AddToList div отображался по умолчанию, а при нажатии я хочу, чтобы он отображал добавленный div.
Все фильмы отображаются через мой список фильмов:
import React from 'react';
const MovieList = (props) => {
const FavoriteComponent = props.favoriteComponent;
return (
<React.Fragment>
{props.movies.map((movie, index) => (
<div className='image-container d-flex justify-content-start m-3'>
<img src={movie.Poster} alt='movie'></img>
<div
onClick={() => props.handleFavoritesClick(movie)}
className='overlay d-flex align-items-center justify-content-center'>
<FavoriteComponent />
</div>
</div>
))}
</React.Fragment>
);
};
export default MovieList;
Нужно ли мне создавать отдельную функцию handleclick для замены divs? Или я могу отредактировать свою функцию addFavoriteMovie, чтобы также включить переключатель div? Или решение — это какой-то обходной метод, например, создание инструкции if о том, был ли фильм выбран или нет?
Ответ №1:
Предполагая, что у вас есть 2 дочерних компонента, которые вы хотите условно отобразить, вы можете использовать следующий способ для запуска другого компонента.
const Component = () => {
const [ active, setActive ] = useState(false)
return (<div>
<button onClick={() => setActive(!active)}> Toggle Me </button>
{ active ? <ChildComponent1 /> : <ChildComponent2 /> }
</div>)
}
Когда вы нажимаете кнопку, она переключает «активное» состояние true / false, и вы отображаете разные компоненты в зависимости от того, является ли это true / false.
Комментарии:
1. Так нужно ли мне помещать AddedToList div в отдельный отдельный компонент? Я не понимаю, как это синхронизируется с функцией handleclick, которая у меня уже есть, где она добавляет фильм в список избранного.
2. вы можете добавить SetActive или аналогичную функцию в свою функцию addtolist