#reactjs #typescript
Вопрос:
Я изучаю машинопись.
Я использовал axios и сохранил возвращаемое api-значение в useEffect и отобразил его на экране, но я получил сообщение об ошибке, в котором говорится, что в интерфейсе ToDoList нет имени. В чем причина?
Спасибо.
import React, {useEffect, useState} from 'react';
import axios from 'axios';
interface todoList {
name: string
age: number
}
function App() {
const defaultProps: todoList[] = [];
const [todoList, setTodoList]: [todoList[], (todoList: todoList[]) => void] = useState(defaultProps);
useEffect(() => {
async function getTodo() {
const response = await axios.get('http://localhost/laravel/public/api/todo');
setTodoList(response.data);
}
getTodo();
}, []);
return (
<div className="App">
{todoList.name} // Error here.
</div>
);
}
export default App;
Ответ №1:
Пункт 1: Это связано с тем, что пользовательский интерфейс отображается перед использованием, и, следовательно, в тот момент, когда пользовательский интерфейс отображается, он ищет todolist.name где todolist пуст, а выборка имени приводит к ошибке. Если должно отображаться конкретное имя каких-либо элементов, проверьте длину массива, чтобы имя не было пустым, прежде чем сопоставлять его с пользовательским интерфейсом
Пункт 2: Если все имена должны быть помещены в пользовательский интерфейс, затем сопоставьте массив, как показано ниже
import React, {useEffect, useState} from 'react';
import axios from 'axios';
function App() {
const [todoList, setTodoList] = useState([]);
useEffect(() => {
async function getTodo() {
const response = await axios.get('http://localhost/laravel/public/api/todo');
setTodoList(response.data);
}
getTodo();
}, []);
return (
<div>
{todoList.map((todo) =>
<p> {todo.name} </p>
)}
</div>
);
}
export default App;
Комментарии:
1. Таким образом, пользовательский интерфейс отображается до эффекта использования. Я многому научился. Спасибо.
2. Приятно слышать, что это было полезно 🙂
Ответ №2:
Ваша todoList
переменная представляет собой массив todoList
s, например todoList[]
. Вы пытаетесь прочитать .name
массив, который не определен.
Вероятно, вы хотите отобразить список элементов:
return <div className="App">
{todoList.map(todo => <div key={todo.name}>
{todo.name}
</div>)}
</div>;
В остальном ваш набор текста кажется нормальным. Одно из предложений для удобства чтения, которое у меня есть, заключается в упрощении вашего useState
заявления:
const [todoList, setTodoList] = useState<todoList>(defaultProps);
С помощью того , как React объявил тип useState
, вы можете использовать useState<T>
, и он автоматически узнает, что возвращает a [T, (value: T) => void]
.
Еще одно небольшое примечание: Обычно интерфейсы/типы являются PascalCase, например TodoList
, чтобы убедиться, что они не конфликтуют с переменными и параметрами функций, которые обычно имеют camelCase, например, ваша todoList
переменная.