РЕАКЦИЯ: состояние компонента не обновляется, когда он загружается из файла cookie

У меня есть приложение React с кнопкой, которая имеет переключатель, этот переключатель позволяет отображать или скрывать некоторые представления на странице, поэтому, если пользователь нажимает кнопку переключения, он увидит одно представление (переключение ВКЛ. вид) или другое (переключение ВЫКЛ. Вид). Я должен сохранить значение этого переключателя в файле cookie, чтобы гарантировать, что при повторном посещении сайта пользователем он увидит последний выбранный вид (включение или выключение).

Я попытался решить эту проблему самым простым способом, создав новое приложение для реагирования с нуля, используя «npx create-react-app». Я также включил библиотеку npm react-cookie.

Это отлично работает, когда пользователь нажимает кнопку переключения, в файле cookie устанавливается правильное значение и отображается правильное представление. Однако, если я перезагружаю страницу, она всегда показывает неправильное представление, игнорируя значение, загруженное из файла cookie. Я не могу объяснить, почему это происходит только при загрузке страницы.

Код index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { CookiesProvider } from 'react-cookie';

ReactDOM.render(<CookiesProvider>
                    <App />
                </CookiesProvider>, 
                document.getElementById('root'));

serviceWorker.unregister();

Код приложения.js:

import React, { Component } from 'react';
import { instanceOf } from 'prop-types';
import './App.css';
import { withCookies, Cookies } from 'react-cookie';

class App extends Component {
  static propTypes = {
    cookies: instanceOf(Cookies).isRequired
  };

  constructor(props) {
    super(props);
    const { cookies } = props;
    var valueToSet = cookies.get('toggleMode');
    console.info('Toggle Value from Cookie: ' + valueToSet);
    this.state = {
      toogle: cookies.get('toggleMode')
    };
  }

  toggleTableModeButtons = () => {
      return ( 
        <div>
          <button type = "button" onClick = {this.toggleMode}>Toggle Now!</button>
        </div>
      );
  };

  toggleMode = event => {
    const { cookies } = this.props;
    event.preventDefault();
    var toogleValueToSet = !this.state.toogle;
    this.setState(
      { toogle: toogleValueToSet }
    );
    console.info('Setting Cookie with value: ' + toogleValueToSet);
    cookies.set('toggleMode', toogleValueToSet, { path: '/' });
  }

  render() {
    const { toogle } = this.state;
    console.info('Toggle Value in RENDER: ' + toogle);
    return (
      <div>
        {this.toggleTableModeButtons()}
        <h1>
        {
          toogle ? "Toggle ON (View 1)" : "Toggle OFF (View 2)"
        }
        </h1>
      </div>
    );
  }
}

export default withCookies(App);

Мне нужно знать, что я делаю неправильно в этом примере. Любая помощь будет действительно оценена.

Поведение ключевого слова "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
0
1 195
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваши файлы cookie возвращают вам строку, а не логическое значение. Вы можете попробовать изменить журнал консоли, как показано ниже, который будет печатать «строку», когда состояние обновляется значением файла cookie. Ваше состояние тоже? всегда будет возвращать true, если есть что-то в toogle, как в случае, когда вы устанавливаете toogle из файлов cookie.

console.info('Toggle Value in RENDER: ' + typeof toogle);

Проанализируйте значение файла cookie с помощью JSON, как показано ниже, чтобы оно работало.

this.state = {
  toogle: JSON.parse(cookies.get('toggleMode')) || false
};

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