Я пытаюсь получить данные из вызова API с помощью реакции и сопоставить их, чтобы я мог перебирать список элементов. Проблема в том, что при получении с помощью response ничего не возвращается в списке, хотя при вызове API есть данные, может ли проблема быть связана с сопоставлением или с состоянием? Я включил столько кода, чтобы вы могли видеть от уровня представления к репозиторию, включая примеры данных, которые возвращаются в API. Я новичок, чтобы отреагировать, спасибо
Реагировать на код
import * as React from 'react';
import './PracticeAreas.css';
import IReportGroup from 'src/model/IReportGroup';
interface IOwnProps {
callAction: any
}
interface IOwnState {
groups: IReportGroup[]
}
class PracticeAreas extends React.Component<IOwnProps, IOwnState> {
constructor(props: IOwnProps) {
super(props);
this.state = {
groups: []
}
}
public render() {
return (
<div className = "col-md-12 practiceAreas">
<h1>Practice Areas</h1>
<div className = "item-container plain-bg selection-refinement">
<div className = "refinement-search">
<input type = "text" value = "" placeholder = "What are you looking for?" />
</div>
</div>
<ul className = "list-inline groupedTags">
{this.state.groups}
</ul>
</div>
);
}
public groups() {
fetch(`https://localhost:44301/api/v2/navigator/reports/groups`)
.then((res) => res.json()
.then((data) => {
const groups = data.results.map((group: IReportGroup) => {
return( <li key = {group.id}>{group.name}</li>
)
})
this.setState({groups: groups});
}))
}
};
export default PracticeAreas
Вызов API
[Route("groups")]
[HttpGet]
public IList<NavigatorReportSelectionGroup> GetGroups()
{
var groups = navigatorReportSelectionService.GetGroups();
return groups.ToList();
}
Сервисный звонок
public IList<NavigatorReportSelectionGroup> GetGroups()
{
var allTopicGroups = navigatorService.GetTopicGroups();
return
allTopicGroups.Select(x => new NavigatorReportSelectionGroup
{
Id = x.GroupId,
Name = x.Name
}).ToList();
}
Репо
public IEnumerable<NavigatorTopicGroup> GetTopicGroups()
{
return navigatorTopicGroupRepository.GetAll();
}
Модель
public class NavigatorTopicGroup
{
public Guid GroupId { get; set; }
public string Name { get; set; }
}
Пример данных API
<NavigatorReportSelectionGroup>
<Focused>false</Focused>
<Id>a184e2c5-af49-413e-9747-06741e97a512</Id>
<Name>Insurance & Reinsurance group</Name>
<Order>0</Order>
<Type>Topics</Type>
</NavigatorReportSelectionGroup>
<NavigatorReportSelectionGroup>
<Focused>false</Focused>
<Id>955e3e12-6e02-4e77-bcec-08b2fcb6f3e8</Id>
<Name>Patents group</Name>
<Order>0</Order>
<Type>Topics</Type>
</NavigatorReportSelectionGroup>
<NavigatorReportSelectionGroup>
<Focused>false</Focused>
<Id>d21384b5-27be-4bfc-963d-0d2ad40dbbfb</Id>
<Name>Employment: Canada group</Name>
<Order>0</Order>
<Type>Topics</Type>
</NavigatorReportSelectionGroup>
IReportGroup:
export default interface IReportGroup {
id: string,
type: ReportOptionType,
name: string,
order: number,
focused: boolean
}
Я нигде не вижу вызываемой функции groups
. Я что-то упускаю ?
@Kabbany вынул слова из моего рта. Я тоже не видел, чтобы его вызывали ... иди
В вашем fetch
отсутствует заявление о возврате. Это частая ошибка, которую легко исправить.
Возьми это:
public groups() {
fetch(`https://***`)
.then((res) => res.json()
.then((data) => {
const groups = data.results.map((group: IReportGroup) => {
return( <li key = {group.id}>{group.name}</li>
)
})
this.setState({groups: groups});
}))
}
и настройте его так: (все, что я изменяю, это добавление отсутствующего оператора возврата)
groups() {
fetch(`https://***`)
.then(res => { return res.json(); })
.then(data => {
const groups = data.results.map((group: IReportGroup) => {
return( <li key = {group.id}>{group.name}</li>
)
this.setState({groups});
})
}))
}
Надеюсь это поможет.
Обновлять
В вашем источнике есть несколько областей, которые можно настроить. Я предполагаю, что у вас есть опыт работы с ООП. Вам не нужно объявлять свои функции как public
или private
.
Ваш setState
выходит за рамки. Так что он ничего не устанавливает. Я не совсем уверен, к какому результату вы стремитесь ... но я бы просто назначил const group
на data.results
, а затем сразу же установил ваше состояние следующим образом:
const groups = data.results;
this.setState({ groups });
Затем вы хотите отобразить этот массив там, где вы хотите, чтобы эти результаты были визуализированы. Я не уверен, что вы где-нибудь вызываете эту функцию. Ваш источник немного трудно читать, возможно, я его не заметил.
Я закончу на этом.
нет пропущенного возврата. Проверьте документация. Стрелочные функции автоматически возвращают все, что происходит после, если это не функция
Я никогда не видел, чтобы исходный код React был таким, как у вас, поэтому я предполагаю, что вы супер-профессионал и то, что вы делаете, выше моей зарплаты :)
хорошо ... console.info (data) во втором операторе then ... вы видите данные?
Ну, не как есть, потому что закрывающая скобка в первом блоке then
стоит после второго, но должна быть перед ней.
Не в соответствии с документация по синтаксису он должен работать нормально, тогда
Позвольте нам продолжить обсуждение в чате.
репост в случае, если этот ответ поможет кому-то другому, кто сталкивается с этим
Во-первых, у вас проблема с объемом. Вы должны поместить вызов this.setState
после сопоставления результатов.
Во-вторых, у вас неправильные закрывающие скобки для первого блока then
.
В-третьих, javascript не требует установки функций как public
или private
.
Попробуй это:
groups() {
fetch(`https://localhost:44301/api/v2/navigator/reports/groups`)
.then((res) => res.json())
.then((data) => {
const groups = data.results.map((group: IReportGroup) => {
return( <li key = {group.id}>{group.name}</li>)
})
this.setState({groups: groups});
})
}
почему
c#
как тэг?