#json #reactjs #typescript #async-await #axios
#json #reactjs #машинописный текст #async-await #аксиос
Вопрос:
Использование axios для извлечения данных из API, а затем попытка сопоставить значения и отобразить их в другом компоненте.
Приложение.tsx
import React, { useState, useEffect } from 'react';
import JobBoardComponent from './components/JobBoardComponent';
import axios from 'axios';
function App(): JSX.Element {
const[jobs, setJobs] = useState<any>([]);
useEffect((): void => {
const fetchJobs = async () => {
const res = await axios('http://localhost:5000/jobs');
setJobs(res.data);
};
fetchJobs();
}, []);
return (
<div className="App">
{jobs.map((job: any) => <JobBoardComponent job={job} key={job.id} />)}
</div>
);
}
export default App;
JobBoardComponent.tsx
import React from 'react'
function JobBoardComponent( job: any, key: any){
return (
<div>
<h1>{ job }</h1>
</div>
)
}
export default JobBoardComponent;
Похоже, что API работает.
Я следую этому руководству https://www.youtube.com/watch?v=JZQ8m08cbF0 но я решил создать свой собственный API, и теперь он не работает.
Комментарии:
1. Какова структура
jobs
переменной с отслеживанием состояния?2. Я не знаю, что вы подразумеваете под структурой заданий с отслеживанием состояния, но если вы имеете в виду структуру данных json, то структура будет такой …. { «id»: 1, «company»: «Photosnap», «logo»: «./images/photosnap.svg», «new»: true, «featured»: true, «должность»: «Старший разработчик интерфейса», «роль»: «Интерфейс», «уровень»: «Старший», «postedAt»: «1 день назад», «контракт»: «Полный рабочий день», «местоположение»: «Только для США», «языки»: [«HTML», «CSS», «JavaScript»], «инструменты»: [] },
3. вы неправильно передаете реквизиты, JobBoardComponent( {job: any, key: any})
Ответ №1:
Пожалуйста, не используйте, any
если вы не находитесь в процессе переноса проекта js в ts (или вам ДЕЙСТВИТЕЛЬНО все равно, какого типа будет переменная, даже тогда вам все равно следует рассмотреть возможность использования неизвестного типа.)
Что касается вашей проблемы, на вашем месте, для быстрого и грязного способа отображения «неизвестных» данных я бы сделал что-то вроде этого (или просто console.log
это, если данные слишком большие).:
...
<h1>{ JSON.stringify(job) }</h1>
...
И я предполагаю, что из ошибки, которую вы только что упомянули (и из приведенного выше сценария, который оправдает мое предположение, если вы его включите), job
это вложенный объект, который не является допустимыми данными для отображения в React. Вероятно, вам следует деструктировать вашу job
переменную внутри JobBoardComponent
.
Опять же, вы можете избежать подобных ошибок, если присвоите своей job
переменной значение, не являющееся any
типом, linter предупредит вас, если вы назначаете неправильные типы, что невозможно при использовании any
.