#reactjs #typescript #react-typescript
#reactjs #typescript #react-typescript
Вопрос:
Я пытаюсь отобразить данные массива, но не отображает данные на веб-странице React. Кто-нибудь укажет мне, где моя ошибка, и поправит меня. Пожалуйста, посмотрите строку комментария //
/* eslint-disable */
import React, { Component } from 'react';
import axios from 'axios';
class RestaurantList extends Component<{}, any> {
constructor(props: any) {
super(props);
this.state = { restoLists: null };
}
componentDidMount() {
axios.get("http://localhost:3030/restauranst")
.then((response) => {
this.setState({ restoLists: response.data })
console.log(response);
})
.catch((error) => console.error(error));
}
render() {
console.log(this.state.restoLists);
return (
<div>
<h1>RestaurantList</h1>
{
this.state.restoLists ?
<div>
<ul>
{
this.state.restoLists.map((itme: any) => {
console.log(itme.name); // work this line
<li>
{itme.name} {/**Does not work this line */}
</li>
})
}
</ul>
</div>
:
<p>Please Wait...</p>
}
</div>
);
}
}
export default RestaurantList;
Ответ API
{
"data": [
{
"id": 1,
"name": "Pizza Hut",
"address": "Dwarka Sector-14",
"rating": "4.5",
"email": "pizzhut@pizza.com"
},
{
"id": 2,
"name": "Mc-Dondle",
"address": "Dwarka Sector-15",
"rating": "4.0",
"email": "mcdondle@mcdon.com"
}
],
"status": 200,
"statusText": "OK",
"headers": {
"cache-control": "no-cache",
"content-type": "application/json; charset=utf-8",
"expires": "-1",
"pragma": "no-cache"
},
"config": {
"url": "http://localhost:3030/restauranst",
"method": "get",
"headers": {
"Accept": "application/json, text/plain, */*"
},
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1
},
"request": {}
}
Комментарии:
1. можете ли вы также поделиться своим ответом API?
2. Включите данные ответа.
3. хорошо, я поделюсь с вами
Ответ №1:
Вы ничего не возвращаете внутри карты.
this.state.restoLists.map(({id, name}: any) => {
return <li key={id}>{name}</li>;
});
Также вы можете использовать сокращенный метод функции стрелки,
this.state.restoLists.map(({id, name}: any) => <li key={id}>{name}</li>);
Комментарии:
1. можно ли использовать
any
в этой ситуации? Я новичок в TS и задаюсь вопросом, не следует ли нам определять каждый отдельный тип переменной / параметра? например, в этой ситуации не должно бытьstring
вместоany
? просто вопрос
Ответ №2:
Возврат из вашей функции map, поскольку вы пропускаете return. и загрузчик также пытается использовать сквозное состояние. По умолчанию сделать isLoadding
false
состояние
this.state = { restoLists: null, isLoadding : false };
componentDidMount() {
this.setState({isLoading: true})
axios
.get("http://localhost:3030/restauranst")
.then((response) => {
this.setState({ restoLists: response.data, isLoading: false})
}).catch((error) => console.error(error));
}
JSX
const { restoLists } = this.state;
return(
<div>
{isLoadding ? <ul>
{restoLists amp;amp; restoLists.map(({id, name}: any) => {
return <li key={id}>{name}</li>;
});
}
</ul>
:<p>Loading...</p>}
</div>
)
Ответ №3:
Вам просто не хватало круглых скобок внутри возвращаемого блока вашего метода map:
this.state.restoLists.map((itme: any) => {(
<li>
{itme.name}
</li>
)})