#javascript #reactjs #axios
Вопрос:
Вот мой код:
import Base from "./Base";
import axios from "axios";
import { createData } from "../../utils";
import { useState, useEffect } from "react";
export default function Today(props) {
const [scoops, setScoops] = useState(0);
//Fetch api/scoops/today
const fetchScoops = async () => {
const res = await axios.get("http://localhost:8000/api/scoops/today/");
setScoops(res.data);
};
useEffect(() => {
fetchScoops();
}, []);
console.log(scoops[0]);
const rows = [
createData(0, 1, scoops[0].title, "http://example.com"),
createData(1, 2, "Paul McCartney", "http://example.com"),
createData(2, 3, "Tom Scholz", "http://example.com"),
createData(3, 4, "Michael Jackson", "http://example.com"),
createData(4, 5, "Bruce Springsteen", "http://example.com"),
];
return <Base rows={rows} duration="Today" />;
}
Вот что возвращает консоль:
> undefined
> Today.js:20 {url: 'http://localhost:8000/api/scoops/1/', title: 'Hello World!', rank: 0, created_at: '2021-10-05T04:44:52.027336Z', updated_at: '2021-10-05T04:44:52.027336Z'}
Проблема в том, что при обновлении страницы я получаю следующее сообщение об ошибке:
TypeError: Cannot read properties of undefined (reading 'title')
Помощь была бы очень признательна!
Обновление: Дополнительная цепочка решила проблему, это отлично работает.
scoops[0]?.title
Комментарии:
1. Когда вы обновите страницу,
scoop
(локальная стадия) будет установлена как 0. В этом-то и проблема. Попробуйте инициализировать массив следующим образомconst [scoops, setScoops] = useState([]);
2. Попытался инициализировать его таким образом, но безуспешно!
Ответ №1:
Вы можете установить начальное scoops
состояние в []
const [scoops, setScoops] = useState([]);
визуализация scoops
при извлечении данных с помощью conditionalRendering
return <> {scoops.lenght > 0 amp;amp; <Base rows={rows} duration="Today" />} </>;
Комментарии:
1. Я попробовал оба предложения, к сожалению, они, похоже, не работают для меня. Мне очень понравилась идея условного переноса, но из-за неопределенного значения, возвращаемого при обновлении, он никогда не показывает мою таблицу при обновлении страницы.
Ответ №2:
Проблема в том, что вы инициализируете scoops
как 0
, но используете его как массив: scoops[0]
Попробуйте инициализировать scoops
как пустой массив. Так что что-то вроде этого должно сработать:
const [scoops, setScoops] = useState([]);
Кроме того, где вы это делаете: scoops[0].title
вместо этого вы должны использовать необязательную цепочку и использовать scoops[0]?.title
Комментарии:
1. Пробовал, но безуспешно!
2. На вашей линии, где вы делаете это:
scoops[0].title
попробуйте это вместо этого:scoops[0]?.title
3. Большое вам спасибо, что решили проблему.