无法访问自定义挂钩中从 axios 返回的对象值
Cant access object value returned from axios in custom hooks
您好,我正在编写代码以在自定义挂钩中使用 axios 获取 JSON 和 return 值,但我无法访问对象 属性 即使它在那里。
我一直在尝试访问 item.title
或 item["title"]
甚至 JSON.parse()
但是 parse()
returned 交叉源错误。
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;
调用hook的函数,我想访问对象:
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"
}
}
PostDetail.js中console.log(item)
的值为:
{
"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": {}
}
提前致谢:)
当您尝试访问返回值时会出现问题,因为在初始渲染时该值不可用,因为效果运行 post 渲染周期,也因为 axios 请求是异步的。
但是,如果您实际将状态初始化为自定义挂钩中的对象,它将起作用
还要确保在状态中设置 res.data.item
而不是 res
。 Post 你可以用 item.title
得到值
旁注:
请确保您的自定义挂钩名称以 use
为前缀,这实际上有助于 eslint 区分自定义挂钩或函数。
此外,由于您正在根据参数 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;
在Post详情组件中使用它,例如
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;
您好,我正在编写代码以在自定义挂钩中使用 axios 获取 JSON 和 return 值,但我无法访问对象 属性 即使它在那里。
我一直在尝试访问 item.title
或 item["title"]
甚至 JSON.parse()
但是 parse()
returned 交叉源错误。
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;
调用hook的函数,我想访问对象:
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"
}
}
PostDetail.js中console.log(item)
的值为:
{
"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": {}
}
提前致谢:)
当您尝试访问返回值时会出现问题,因为在初始渲染时该值不可用,因为效果运行 post 渲染周期,也因为 axios 请求是异步的。
但是,如果您实际将状态初始化为自定义挂钩中的对象,它将起作用
还要确保在状态中设置 res.data.item
而不是 res
。 Post 你可以用 item.title
旁注:
请确保您的自定义挂钩名称以 use
为前缀,这实际上有助于 eslint 区分自定义挂钩或函数。
此外,由于您正在根据参数 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;
在Post详情组件中使用它,例如
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;