Обновление опоры React с помощью setTimeout ()

Я пытаюсь использовать React впервые и ищу способ поместить содержимое массива, который обновляется новыми данными каждые 4 секунды, в тег H3. Я знаю, что этого можно достичь с помощью vanilla JS, но хочу знать, есть ли хороший и чистый способ сделать это через экосистему React.

В настоящий момент функция запускается, и журнал консоли показывает, что массив обновляется с точными интервалами, однако фактический тег H3 остается пустым.

Я попытался использовать componentHasMounted () и попытался найти способы разместить функцию render () внутри функции Professions (), но не смог найти способ правильно инкапсулировать ее (если это вообще возможно). Я также пытался следовать новому руководству Date () по обновлению визуализированных элементов в документации React, но безрезультатно - я уверен, что это, вероятно, будет ошибкой с моей стороны, но любая помощь со стороны сообщества SO будет рок.

Внимание, для этого я использую приложение create-react-app.

Вот код:

Profession.js

import React, { Component } from 'react';
import './Profession.css';

class Profession extends Component {
  constructor(props) {
      super(props);
      this.state = {profession: professions()};
  }

  render() {
    return (
      <div className = "Profession">
          <div className = "keyboard">
          <h3>{this.state.profession}</h3>
          </div>
      </div>
    );
  }
}

function professions() {
    const professionList = ['Developer', 'Designer'];
    var profession = [];
    for (var i = 0; i < professionList.length; i++) {
        setTimeout(function (i) {
            return function () {
                profession = [];
                profession.push(professionList[i]);
                console.info(profession);
                return profession;
            }
        }(i), 3800*i);
    }
}




export default Profession;

И App.js на всякий случай

import React, { Component } from 'react';
import './App.css';
import Profession from './Profession'

class App extends Component {
  render() {
    return (
      <div className = "App">


        <h1>Sunil<br/>Sandhu</h1>
        <Profession />
      </div>
    );
  }
}

export default 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) для оценки ваших знаний,...
1
0
1 960
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Установите локальное состояние profession внутри professions(), а не в constructor. Кроме того, professions() должен быть частью компонента, чтобы он мог обновлять локальное состояние. Это запустит компонент для обновления и обновления H3.

import React, { Component } from 'react';
import './Profession.css';

class Profession extends Component {
  constructor(props) {
    super(props);

    // set 'profession' default to null
    this.state = {profession: null};

  }

  componentDidMount() {
    // call professions() here
    this.professions();
  }

  professions() {
    const professionList = [
      'Sunny',
      'Developer',
      'Designer',
      'Programmer',
      'Notebook Hoarder',
      'Developer',
    ];

    for (let i = 0, l = professionList.length; i < l; i++) {
      setTimeout(() => {
        // update local state property 'profession'
        that.setState({ profession: professionList[i] });
      }, 4000*i);
    }
  }

  render() {
    return (
      <div className = "Profession">
        <div className = "keyboard">
          <h3>{this.state.profession}</h3>
        </div>
      </div>
    );
  }
}

export default Profession;

Надеюсь, поможет :)

Привет, спасибо за вклад, Рахул, ценю это. По сути, я просто пытаюсь заставить h3 выводить первый элемент в массиве, а не весь массив. Но теперь, когда вы упомянули об этом, на самом деле имеет гораздо больше смысла просто установить для переменной профессии значение professionalList [i]. Я просто собираюсь сделать это сейчас и доложу, чтобы увидеть, сработал ли ваш код. :)

Sunil Sandhu 30.03.2018 02:05

Хммм, я использовал ваш точный код, но тег H3 все еще отображается как пустой. Он также теперь возвращает this.setState не является функцией. Если я удалю строку this.setState ({Profession}), страница загрузится и функция будет работать внутри класса, но тег H3 все равно останется пустым :(

Sunil Sandhu 30.03.2018 02:17

А, я думаю, я понимаю, в чем проблема с кодом - this.setState определенно требовался, но он пытался ссылаться на this в отношении функции setTimeout (), а не свойства компонента. Итак, теперь страница отображается с обновленным содержимым - большое спасибо! Я отредактирую ваш ответ и помечу как правильный :)

Sunil Sandhu 30.03.2018 02:36

@SunilSandhu, хороший улов! Также я считаю, что было бы более целесообразно вызывать this.professions() в componentDidMount() вместо render().

Rahul Desai 30.03.2018 03:09

Вы совершенно правы! Я снова отредактировал ответ, чтобы теперь включить и его. :)

Sunil Sandhu 30.03.2018 10:55

@SunilSandhu Я немного оптимизировал ваш код. К вашему сведению - вам не нужно обрабатывать this отдельно, если вы используете стрелочные функции ES6 =>

Rahul Desai 31.03.2018 00:23

Ах, это здорово! Я пытался использовать стрелочные функции именно по этой причине, но в то время у меня были небольшие трудности с их работой, но похоже, что это могло быть из-за того, что другие части не работали в то время. Большое спасибо за вашу помощь с этим - не стесняйтесь проверить www.sunilsandhu.com, если вы вообще заинтересованы в том, чтобы увидеть, для чего мне нужен код :)

Sunil Sandhu 01.04.2018 01:05

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