【发布时间】:2021-09-18 10:38:48
【问题描述】:
我正在使用 Django rest 发送数据以做出反应:
[
{
"id": 1,
"username": "Dewalian",
"question": [
{
"id": 5,
"title": "how to cook?"
},
{
"id": 6,
"title": "how to exercise?"
}
]
},
{
"id": 2,
"username": "Edward",
"question": []
},
{
"id": 3,
"username": "Jeremy",
"question": []
}
]
然后使用视频教程中的自定义钩子获取它:
import useFetch from "./UseFetch";
import DataList from "./DataList";
const MainContent = () => {
const {data: question, isPending, error} = useFetch("http://127.0.0.1:8000/api/user/");
return (
<div className="main-content">
{error && <div>{error}</div>}
{isPending && <div>Loading...</div>}
{question && <DataList data={question} />}
</div>
);
};
export default MainContent;
最后我把它映射到另一个组件上:
const DataList = (data) => {
return (
<div>
{data.map(user => (
<div key={user.id}>
<p>{user.username}</p>
</div>
))}
</div>
);
}
export default DataList;
但我得到“TypeError:data.map 不是函数”。我很确定问题出在 json 上,但我不知道出了什么问题。那么,出了什么问题以及如何解决这个问题?谢谢。
编辑
这是 useFetch 自定义钩子(只是带有 useEffect 的普通获取):
import { useEffect, useState } from "react";
const useFetch = (url) => {
const [data, setData] = useState(null);
const [isPending, setIsPending] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const abortCont = new AbortController();
fetch(url)
.then(res => {
if (!res.ok) {
throw Error ("Couldn't fetch data from that resource.")
};
return res.json()
})
.then(data => {
setData(data);
setIsPending(false);
setError(null);
})
.catch(err => {
if (err.name === "AbortError") {
console.log("fetch aborted.")
} else {
setIsPending(false);
setError(err.message);
};
});
return () => abortCont.abort();
}, [url]);
return {data, isPending, error};
};
export default useFetch;
和 api/用户:
@api_view(["GET"])
def user_all(request):
model_data = User.objects.all()
serializer = UserSerializer(model_data, many=True)
return Response(serializer.data)
【问题讨论】:
-
我认为如果你通过在 useFetch 行设置断点来查看返回值是什么来调试它会很容易。
-
返回值和上面的json数据一模一样(另外两个基本是检查“加载”和错误值)
标签: json reactjs django django-rest-framework