Я пытаюсь использовать 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;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Установите локальное состояние 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 все еще отображается как пустой. Он также теперь возвращает this.setState не является функцией. Если я удалю строку this.setState ({Profession}), страница загрузится и функция будет работать внутри класса, но тег H3 все равно останется пустым :(
А, я думаю, я понимаю, в чем проблема с кодом - this.setState определенно требовался, но он пытался ссылаться на this в отношении функции setTimeout (), а не свойства компонента. Итак, теперь страница отображается с обновленным содержимым - большое спасибо! Я отредактирую ваш ответ и помечу как правильный :)
@SunilSandhu, хороший улов! Также я считаю, что было бы более целесообразно вызывать this.professions() в componentDidMount() вместо render().
Вы совершенно правы! Я снова отредактировал ответ, чтобы теперь включить и его. :)
@SunilSandhu Я немного оптимизировал ваш код. К вашему сведению - вам не нужно обрабатывать this отдельно, если вы используете стрелочные функции ES6 =>
Ах, это здорово! Я пытался использовать стрелочные функции именно по этой причине, но в то время у меня были небольшие трудности с их работой, но похоже, что это могло быть из-за того, что другие части не работали в то время. Большое спасибо за вашу помощь с этим - не стесняйтесь проверить www.sunilsandhu.com, если вы вообще заинтересованы в том, чтобы увидеть, для чего мне нужен код :)
Привет, спасибо за вклад, Рахул, ценю это. По сути, я просто пытаюсь заставить h3 выводить первый элемент в массиве, а не весь массив. Но теперь, когда вы упомянули об этом, на самом деле имеет гораздо больше смысла просто установить для переменной профессии значение professionalList [i]. Я просто собираюсь сделать это сейчас и доложу, чтобы увидеть, сработал ли ваш код. :)