Написал следующий код по примерам с fetch
:
import React, { Component} from 'react';
import { Container, Col, Row } from 'reactstrap';
import './Blog.css';
export class Blog extends Component {
render() {
return (
<Container>
<PostMaker id={4} />
<PostMaker id={5} />
<PostMaker id={9} />
</Container>
);
}
}
export class PostMaker extends Component {
constructor(props) {
super(props);
this.state = { id: 0, data: [] };
}
componentDidMount() {
const url = 'api/article/makenewpost/?id=' + this.props.id;
fetch(url, {
method: "GET",
headers: {
"Content-Type":"application/json"
},
}).then((response) => { this.setState({id: this.props.id, data:response})})
}
render() {
return (<Container>
<Row>
<Col xs={12} className="title">
<h2>{this.state.data[0].title}</h2>
</Col>
</Row>
<Row>
<Col xs={12} className="body">
<p>{this.state.data[0].body}</p>
</Col>
</Row>
</Container>);
}
}
Вылезает исключение:
TypeError: Cannot read property 'title' of undefined
Почему так происходит? render
происходит перед fetch
? Как мне правильно переделать код?
Если нужен метод из контроллера:
public IActionResult MakeNewPost(int id)
{
var articles = _context.Post.Where(p => p.Id == id).Select(p => p);
var title = articles.Select(p => p.Title).First();
var body = articles.Select(p => p.Body).First();
List<Post> posts = new List<Post>{
new Post
{
Title = title,
Body = body,
}};
return Json(posts.ToArray());
}
componentDidMount
срабатывает всегда после первого render
.fetch
асинхронен, то даже, если бы componentDidMount
срабатывал перед render
, то результат fetch
всё равно пришёл бы позже render
.В render
в самом начале напишите:
render() {
if(!this.state.data || !this.state.data.length)
return null;
// а дальше ваш остальной код
}
Тогда ничего рендериться не будет, пока не получен ответ на fetch
запрос. И, следовательно, ошибки не будет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хочу отменить стандартное действие при нажатии на кнопку "Назад", есть функция, которая отслеживает нажатие на кнопку "Назад"
https://learnjavascript
как объединить их в thisbufArr, чтобы ключами были буквы из leftArray а значение брались по букве из letterArray Пытался пушом но не получалось
На сайте с задачами выбрал язык JavaScriptПодскажите, как данные из поля "Test input" записать в первые 3 переменные