#reactjs
Вопрос:
У меня есть состояние, определенное следующим образом:
state = {
items: [
{id: 0, value: 0},
{id: 1, value: 0},
],
};
когда я console.log(this.state.items[0].id) в конструкторе, я получаю правильное значение.
Но когда я пытаюсь сделать это так:
render() {
return (
<div>
<table>
<tr>
<th id="d0" onClick={(e)=>this.onClick(e)}>{this.state.items[0].id}</th>
....
Там написано «Не удается прочитать свойство ‘0’ неопределенного».
Происходит ли рендеринг до инициализации состояния и, следовательно, не определен при попытке рендеринга?
class App extends React.Component {
/**
* @param {object} props
*/
state = {
items: [
{ id: 0, value: 0 },
{ id: 1, value: 0 },
],
};
constructor(props) {
super(props);
console.log(this.state.items[0].id);
}
render() {
return (
<div>
<table>
<tbody>
<tr>
<th id="d0" onClick={(e) => this.onClick(e)}>th</th>
<th id="d1">h</th>
</tr>
</tbody>
</table>
</div>
);
}
onClick(e) {
this.setState({ day0: 6 });
}
}
ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
Комментарии:
1. @Опубликовано определенное качество
2. Я не могу воспроизвести проблему. Похоже, что он будет отображаться правильно без ошибок. Смотрите фрагмент в прямом эфире.
3. @CertainPerformance Я не пытаюсь отобразить «th», я пытаюсь отобразить этот.state.items[0].id
Ответ №1:
Ваше состояние должно быть задано в вашем конструкторе
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
items: [
{ id: 0, value: 0 },
{ id: 1, value: 0 },
]
}
}
render() {
return (
<div>
<table>
<tr>
<th id="d0" onClick={(e)=>this.onClick(e)}>{this.state.items[0].id}</th>
</tr>
</table>
</div>
);
}
}
Ответ №2:
Вы неправильно инициализируете состояние. Состояния должны быть инициализированы внутри конструктора в компонентах на основе классов. Пожалуйста, обновите инициализацию состояния следующим образом :
class App extends React.Component {
/**
* @param {object} props
*/
constructor(props) {
super(props);
this.state = {
items: [
{ id: 0, value: 0 },
{ id: 1, value: 0 },
],
};
}
render() {
return (
<div>
<table>
<tbody>
<tr>
<th id="d0" onClick={(e) => this.onClick(e)}>{this.state.items[0].id}</th>
<th id="d1">h</th>
</tr>
</tbody>
</table>
</div>
);
}
onClick(e) {
this.setState({ day0: 6 });
}
}
ReactDOM.render(<App />, document.querySelector('.react'));