Изменение состояния реакции не показывает изменения при возврате

У меня есть приложение, которое перечисляет книги на пользовательской полке, а затем на следующей странице поиска. Пользователь переходит на страницу поиска, находит заголовок и выбирает полку для заголовка, на которой нужно разместить его. Когда они вернутся на главную страницу, этот заголовок должен отображаться на нужной полке.

Функциональность заключается в том, что в объекты вносятся изменения, но когда я нажимаю кнопку «Домой» или «Назад» в браузере, изменения не отображаются, пока я не обновлю браузер.

Что мне нужно сделать, чтобы это изменение отображалось, когда пользователь переходит на домашнюю страницу?

Я поместил основную часть кода в Коды

App.js

import React, { Component } from 'react'
import ListBooks from './ListBooks'
import SearchBooks from './SearchBooks'
import * as BooksAPI from './utils/BooksAPI'
import { Route } from 'react-router-dom'

class BooksApp extends Component {

  state = {
    books: []
  }

  componentDidMount() {
    BooksAPI.getAll()
    .then((books) => {
      this.setState(() => ({
        books
      }))
    })
  }

  updateShelf = (book, shelf) => {
    const bookFromState = this.state.books.find(b => b.id === book.id);
    if (bookFromState) {
      // update existing
      bookFromState.shelf = shelf;
      this.setState(currentState => ({
        books: currentState.books
      }));
    } else {
      // add new one
      this.setState(prevState => ({
        books: prevState.books
      }));
    }
    BooksAPI.update(book, shelf);
  };

  render() {
    return (
      <div>
        <Route exact path='/' render = {() => (
          <ListBooks
          books = {this.state.books}
          onUpdateShelf = {this.updateShelf}
          />
        )} />
        <Route exact path='/search' render = {() => (
          <SearchBooks
          books = {this.state.books}
          onUpdateShelf = {this.updateShelf}
          />
        )} />
      </div>
    )
  }
}
export default BooksApp

ваша песочница не работает

seethrough 01.06.2018 15:30

Это происходит, просто щелкните желтую вкладку в окне браузера песочницы. Не уверен, почему появляется эта ошибка, но это только в песочнице

3therk1ll 01.06.2018 15:32
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Итак, я проверил ваш код. На самом деле у вас была проблема с обновлением вашего состояния. books не менялся после того, как вы выбрали книгу на экране поиска. Вот код из вашего App.js:

updateShelf = (book, shelf) => {
  console.info(book, shelf)
  const bookFromState = this.state.books.find(b => b.id === book.id);
  if (bookFromState) {
    // update existing
    bookFromState.shelf = shelf;
    this.setState(currentState => ({
      books: currentState.books
    }));
  } else {
    // add new one
    // the following lines of yours were different
      book.shelf = shelf;
      this.setState(prevState => ({
        books: prevState.books.concat(book)
    }));
  }
  BooksAPI.update(book, shelf);
};

Таким образом, у вас просто был books: prevState.books вместо того, чтобы фактически объединить книгу с предыдущим состоянием. А прямо перед этим полку с книгой нужно поменять на ту, которую вы проходите. PS: Возможно, я оставил какие-то заявления console.info. Надеюсь, это не проблема, и вы уберете беспорядок.

Потрясающие! Привет, дружище, это было на высоте.

3therk1ll 01.06.2018 16:51

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