Как сохранить состояние для компонента, добавленного в список избранного

Я пытаюсь сохранить состояние в трех глобальных точках зрения.

У меня есть компонент MovieRow, который называется в компонентах Popular, Favorite и Search. Цель состоит в том, чтобы компонент MovieRow сохранял свое состояние при вызове в этих представлениях (Popular ...)

Например, если у меня есть 2 фильма, я проверил один фильм, чтобы добавить его в избранное, этот фильм должен сохранить состояние. Теперь, если я добавляю фильм в список избранных, когда я щелкаю и изменяю глобальное представление, компонент MovieRow снова монтируется и сбрасывает состояние.

Я пробовал много разных способов. Сохраните состояние одной глобальной переменной с условным рендерингом для моего MovieRow и других.

Обновлено: здесь вы можете увидеть полный код https://codesandbox.io/s/lpjp0oxmmq

Изменить 2: я успешно сохраняю свое состояние, но не могу правильно использовать.

componentWillUnmount () {
    let storeState = localStorage.setItem('someSavedState', JSON.stringify(this.state))
    console.info(" ------------------- unmount ------------------- ")
    console.info(JSON.parse(localStorage.getItem('someSavedState')))
    console.info(" ------------------- ------- ------------------- ")
}

componentWillMount() {
    const rehydrate = JSON.parse(localStorage.getItem('someSavedState'))
    console.info(" ------------------- will mount ------------------- ")
    console.info(rehydrate)
    console.info(" ------------------- ---- ----- ------------------- ")
    // this.setState({isFaved: rehydrate})
}

Ты хоть представляешь, кто мне поможет?

Мы видим, как государство теряется на этой картинке. Цвет кнопки, зависящей от состояния, был сброшен.

Просмотр популярных с первым фильмом, добавленным в избранное

просмотреть избранное с любимым фильмом

MoviesRow.js:

import React from 'react'
import '../css/MovieRow.css';
import { APIKEY, baseURL } from '../../App'
import { filter } from '../../View/Popular'

var myFavoriteMovies = []

function IsFav(props) {
    return (
        <div movieId = {props.movie.id} className = "MovieRow">
        <div>
        <img alt = "poster" src = {props.posterSrc} />
        </div>
        <div>
        <h3>{props.movie.title}</h3>
        <p>{props.movie.overview}</p>
        <input type = "button" value = "View"/>

        <button onClick = {props.onClick}  className = " heart">
        </button>

        </div>
        </div>
        );
}

function IsNotFav(props) {
    return (
        <div movieId = {props.movie.id} className = "MovieRow">
        <div>
        <img alt = "poster" src = {props.posterSrc} />
        </div>
        <div>
        <h3>{props.movie.title}</h3>
        <p>{props.movie.overview}</p>
        <input type = "button" value = "View"/>

        <button onClick = {props.onClick} className = "toggled heart">
        </button>

        </div>
        </div>

        );
}

class MovieRow extends React.Component {
    constructor(props) {
        super(props)
        this.addFavorite = this.addFavorite.bind(this)
        this.deleteFavorite = this.deleteFavorite.bind(this)
        this.state = {
            isFaved: false,
        }
    }

    viewMovie() {
        const url = "https://www.themoviedb.org/movie/" + this.props.movie.id
        window.location.href = url
        console.info(this.props.movie.id)
    }

    addFavorite() {
        this.setState({isFaved: true})
        const favMovie = "".concat(baseURL, 'movie/', this.props.movie.id ,'?api_key=', APIKEY) 
        myFavoriteMovies.push(favMovie)
    }

    deleteFavorite() {
        this.setState({isFaved: false})
    }

    render() {
        const isFaved = this.state.isFaved;
        let movie;

        if (isFaved) {
            movie = <IsNotFav  movie = {this.props.movie} posterSrc = {this.props.posterSrc} onClick = {this.deleteFavorite}/>
        } else {
            movie = <IsFav movie = {this.props.movie} posterSrc = {this.props.posterSrc} onClick = {this.addFavorite}/>
        }

        return movie
    }
}
export { MovieRow as default, myFavoriteMovies}

Вы можете попробовать объявить массив myFavoriteMovies в Favorite и передать его в MovieRow в качестве опоры. Конечно, тогда вам нужно будет передать toggleFavorite (привязанный к Favorite) как опору. Перемещая состояние вверх таким образом, вы можете гарантировать, что Favorite будет чувствителен к изменению состояния и соответственно произведет повторную визуализацию.

Parabolord 14.07.2018 18:28

Да, но все мои представления (у меня есть три глобальных компонента PopularSearchFavorite) Все эти компоненты отображают фильмы с MovieRow. Я должен отображать избранное состояние во всех глобальных компонентах. Если я реализую вашу идею, у меня есть актуальное состояние в глобальном компоненте Favorite, а не в других, таких как Search или Popular, или в будущих компонентах

crg 14.07.2018 19:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
2
2 274
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я переработал ваш исходный код, чтобы предоставить пример того, как сохранить состояние в вашем компоненте Popular при прохождении маршрутов.

См. Ссылку ниже. Удачного кодирования.

Ссылка CodeSandbox

Отлично, спасибо @CesarNapoleonMejiaLeiva. У меня было плохое начало. Я перезапускаю мозговую волну вашего кода.

crg 20.07.2018 09:55

Другие вопросы по теме