嗨,我正在编写代码以获得带有axios的JSON在自定义钩子中并返回值,但是即使它在那里,我也无法访问object属性。
我一直试图访问item.title
或item["title"]
,甚至是JSON.parse()
,但parse()
返回了交叉原点错误。
customHooks.js
import { useState, useEffect } from "react";
import axios from "axios";
const GetPost = (id) => {
const [post, setPost] = useState();
useEffect(() => {
axios.get(`http://localhost:8000/post/${id}`).then((res) => setPost(res));
}, []);
return post;
};
export default GetPost;
函数,其中调用钩子,我希望访问该对象:
import React from "react";
import getPost from "../customHooks/GetPost";
import { Jumbotron, Container } from "react-bootstrap";
const PostDetail = (props) => {
const item = getPost(props.match.params.id);
console.log(item); // i can access the object
console.log(item.title); //TypeError: Cannot read property 'title' of undefined
return (
<Jumbotron fluid>
<Container>
{/* <h1>{item.title}</h1>
<p>{item.description}</p> */}
</Container>
</Jumbotron>
);
};
export default PostDetail;
服务器http://localhost:8000/post/post_5e9cbf07b44c7的实际响应是:
{
"message": "success",
"item": {
"post_id": "post_5e9cbf07b44c7",
"title": "Asperiores.",
"description": "Porro iure aliquam laborum veniam quis vel. At itaque voluptas voluptas natus eligendi aut facilis.",
"content": "lorem ipsum",
"img_url": "https://lorempixel.com/100/100/cats/?61693",
"created_by": "user_5e9cbf07b48fc",
"created_at": "2020-04-19 21:13:43",
"updated_at": "2020-04-19 21:13:43"
}
}
console.log(item)
在PostDetail.js中的值是:
{
"data": {
"message": "success",
"item": {
"post_id": "post_5e9cbf07b44c7",
"title": "Asperiores.",
"description": "Porro iure aliquam laborum veniam quis vel. At itaque voluptas voluptas natus eligendi aut facilis.",
"content": "lorem ipsum.",
"img_url": "https://lorempixel.com/100/100/cats/?61693",
"created_by": "user_5e9cbf07b48fc",
"created_at": "2020-04-19 21:13:43",
"updated_at": "2020-04-19 21:13:43"
}
},
"status": 200,
"statusText": "OK",
"headers": {
"cache-control": "no-cache, private",
"content-type": "application/json"
},
"config": {
"url": "http://localhost:8000/post/post_5e9cbf07b44c7",
"method": "get",
"headers": {
"Accept": "application/json, text/plain, */*"
},
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1
},
"request": {}
}
(预先谢谢:)
发布于 2020-04-21 05:37:09
当您试图访问返回的值时,会出现问题,因为在初始呈现时,该值不可用,因为效果运行后呈现周期,还因为axios请求是异步的。
但是,如果您实际上将状态初始化为自定义钩子中的对象,则它将工作。
还要确保在状态中设置res.data.item
,而不是res
。发布您可以使用item.title
获得值的帖子
SideNotes:
请确保在自定义钩子名称前加上use
,这实际上有助于明确自定义钩子与函数之间的区别。
另外,由于您是基于param id进行API调用,我建议您在自定义钩子中将该id作为依赖项传递给useEffect,以便更改id的方案也能无缝地工作。
import { useState, useEffect } from "react";
import axios from "axios";
const useGetPost = (id) => {
const [post, setPost] = useState({}); // initialize here
useEffect(() => {
axios.get(`http://localhost:8000/post/${id}`).then((res) => setPost(res.data.item));
}, [id]); // pass id as a dependency here
return post;
};
export default useGetPost;
在PostDetail组件中使用它,如
import React from "react";
import useGetPost from "../customHooks/GetPost";
import { Jumbotron, Container } from "react-bootstrap";
const PostDetail = (props) => {
const item = useGetPost(props.match.params.id);
console.log(item);
console.log(item.title);
return (
<Jumbotron fluid>
<Container>
{/* <h1>{item.title}</h1>
<p>{item.description}</p> */}
</Container>
</Jumbotron>
);
};
export default PostDetail;
https://stackoverflow.com/questions/61344793
复制相似问题