Как визуализировать компоненты React с данными из localStorage?

Я создаю приложение React, в котором большая часть содержимого приложения реакции извлекается из localStorage. Вместо использования базы данных при запуске приложения первое, что делается, - это заполнение localStorage данными, затем HTML создается из JS с использованием данных из localStorage ....

Но теперь с React я начинаю переходить от жесткого кодирования информации к использованию ее из localStorage. Однако кажется, что реагирующие компоненты отображаются до JS, загружающего localStorage. Используя console.info, я обнаружил, что рендеринг React был выполнен раньше всего. Как я могу убедиться, что HTML (из компонентов реакции) не реализован до тех пор, пока ПОСЛЕ выполнения JS, который создает localStorage?

ОСНОВНОЙ КОМПОНЕНТ ПРИЛОЖЕНИЯ

class App extends React.Component {

  constructor(props) {
    super(props);
    console.info("Constructing App");
  }

  render() {
    return (
    <div>
      <Navigation {this.title: "Something based on localStorage"/>
     </div>
    )}
 }

НАВИГАЦИОННЫЙ КОМПОНЕНТ

function Navigation(props) {
  console.info("Constructing Nav");

  return ("stuff here pulled from props like props.title")
}
Поведение ключевого слова "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 142
3

Ответы 3

Можно использовать локальное хранилище getItemметод - localStorage.getItem('myData');

class App extends React.Component {

  constructor(props) {
    super(props);
    state: {
      myData: {}      
    }  
  }

  componentDidMount(){
    const myData = localStorage.getItem('myData');
    // set the state with the data
    this.setState({myData});
  }

  render() {
    return (
    <div>
      <Navigation title = {this.state.myData} />
     </div>
    )}
 }

это вообще не решает проблему. Это получает файл localStorage. Но проблема в том, что он получит localStorage ДО того, как он будет заполнен моим JQuery. Мне нужен React для загрузки компонентов ПОСЛЕ заполнения хранилища

user10059818 20.07.2018 19:08

где jQuery в вашем посте? вы впервые упомянули об этом, и какое отношение имеет jQuery к localStorage?

Sagiv b.g 20.07.2018 19:12

@ user10059818 вы никогда не упоминали jQuery в своем вопросе.

Reactgular 20.07.2018 19:12

@ user10059818 В любом случае, если вам нужны данные перед монтированием компонента, вы можете сделать это методом constructor.

Sagiv b.g 20.07.2018 19:19

Я мог бы вызвать свою функцию loadMyDataInStorage (), однако из-за асинхронности React продолжит отрисовывать все остальное после того, как вызовет функцию .... Это означает, что все еще отрисовывается до завершения функции LoadMyDatainStorage ().

user10059818 20.07.2018 19:33

@ user10059818 где асинхронный код в этом коде? localStorage.getItem не асинхронный. это просто зависит от того, какой жизненный цикл реакции вы используете, тот, который вызывается до или после установки

Sagiv b.g 20.07.2018 19:40

опять же проблема не в getLocalStorage. это функция, которую у меня есть loadMyDataInStorage (), которая помещает информацию В localStorage. это требует времени и завершается только после Render of React

user10059818 20.07.2018 19:42

@ user10059818 тогда включите реальную проблему в свой вопрос. Аган, я не знаю, почему ваша функция асинхронна, поскольку localStorage.setItem тоже не асинхронен. В общем, когда у вас есть функция синхронизации и вы хотите вызвать что-то, когда это будет сделано, вы можете передать обратный вызов или использовать async await (вам нужно будет вернуть обещание для создания микрозадачи).

Sagiv b.g 20.07.2018 19:45

@ user10059818 это функция, которую у меня есть loadMyDataInStorage (), которая помещает информацию в localStorage. Тогда нет смысла использовать localStorage в качестве единственного источника истины (это то, что вы пытаетесь сделать). У вас проблема XY.

Estus Flask 21.07.2018 00:04

Позвольте мне попробовать немного пересмотреть ваш код:

class App extends React.Component {
      constructor(props) {
        super(props);
        console.info("Constructing App");
        this.state = {
          fromLocal:''
        }
      }
      componentDidMount(){
        let newSearchColumns = localStorage.getItem('searchColumns');
        this.setState({fromLocal: newSearchColumns})
      }

      render() {
        return (
        <div>
          <Navigation title= {this.state.fromLocal}/>
         </div>
        )}
     }

Вам следует изучить следующее: Методы жизненного цикла а также Локальное хранилище

Методы компонента React по умолчанию запускаются в определенной последовательности («жизненный цикл» компонента).

Если у вас есть операции, которые вы хотите выполнить, например создание localStorage, вы можете разместить их раньше в последовательности.

Инициализация, и монтирование происходят до рендеринга, поэтому вы можете создать localStorage на любом из этих этапов. В частности, попробуйте переопределить метод componentWillMount ().

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