#javascript #reactjs #react-hooks #es6-promise
#javascript #reactjs #реагирующие хуки #es6-обещание
Вопрос:
import { handleResponse, handleError } from "./apiUtils";
const baseUrl = process.env.REACT_APP_API_URL;
export function getAllNotes() {
return fetch(baseUrl "/notes", {
method: "GET",
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
})
.then(res =>res.json())
.then(data=>console.log(data))
}
export async function handleResponse(response) {
if (response.ok) return response.json();
if (response.status === 400) {
// So, a server-side validation error occurred.
// Server side validation returns a string error message, so parse as text instead of json.
const error = await response.text();
throw new Error(error);
}
throw new Error("Network response was not ok.");
}
// In a real app, would likely call an error logging service.
export function handleError(error) {
// eslint-disable-next-line no-console
console.error("API call failed. " error);
throw error;
}
Я пытаюсь изучить функциональные компоненты react и освоиться с перехватчиками React. Я импортирую функцию из Api.js страница и запустить ее внутри useEffect. Предполагается, что функция попадает на мой серверный сервер, который извлекает данные из mongo Atlas и отправляет их на мой интерфейс для отображения. Данные представляют собой массив из 4 объектов. Я не могу отобразить его, потому что, когда компонент отображает тестовую переменную, она не определена. Я долгое время пытался это понять. Это было бы огромной помощью, и, пожалуйста, объясните не очень техническим способом, я с трудом понимаю очень технические термины. Спасибо!
import React, {useState, useEffect} from 'react';
import {getAllNotes} from '../api/authorApi'
function CourseList(props) {
const [test, setTest] =useState([])
useEffect(()=>{
getAllNotes().then(_test=> setTest(_test))
}, []);
return (
<table className="table">
<thead>
<tr>
<th>Title</th>
<th>Author ID</th>
<th>Category</th>
</tr>
</thead>
<tbody>
{test.map(course => {
return (
<tr key={course.user_id}>hi
</tr>
);
})}
</tbody>
</table>
);
}
Комментарии:
1. Проблема в
getAllNotes
функции, а не в предоставленном коде (скорее всего)2. Этот код, кажется, в порядке. Может быть, что-то не так внутри getAllNotes?
3. `тестовая переменная не определена` Ну, изначально значение представляет собой пустой массив, который не является неопределенным, затем вы устанавливаете его с помощью
_test
Так что проблема в том, что_test
это не то, что вы ожидаете4. это функция, импортируемая из другого файла: функция экспорта getAllNotes() { возвращает выборку(baseUrl «/notes», { метод: «GET», заголовки: { ‘Accept’: ‘application / json’, ‘Content-Type’: ‘application /json’ } }) .затем(res =>res.json()) .затем(data=>console.log(данные)) }
5. Пожалуйста, обновите свой вопрос дополнительным кодом. Кроме того, вы должны проверить
res.ok
запрос на выборку, чтобы убедиться, что выборка прошла успешно. developer.mozilla.org/en-US/docs/Web/API/Fetch_API /…
Ответ №1:
Изменений немного, вы должны вернуть обещание.
Пример кода:
import React, { useState, useEffect, Fragment } from 'react';
const getNotes = () => {
return new Promise (
(resolve, reject) =>
fetch('https://jsonplaceholder.typicode.com/todos')
.then(data => resolve(data.json()))
.catch(err => reject(err))
)
}
const ToDos = () => {
const [toDos, setToDos] = useState([]);
useEffect(() => {
getNotes().then( data => setToDos(data))
}, []);
const renderData = () => toDos.map((toDo) => <li>title: { toDo.title } </li>)
return (
<Fragment>
<ul>
{renderData()}
</ul>
</Fragment>
)
}
export default ToDos;
В вашем случае функция ничего не возвращает getNotes
после завершения вызова API, следовательно, test
не определено, в результате это приводит к ошибке: Cannot read property 'map' of undefined
.
фрагмент рабочего кода:https://codesandbox.io/s/react-playground-forked-bwt89?file=/ToDoSample.jsx