javascript - 在 JS 编译时 React DOM 更新。但是刷新浏览器会给出错误'无法读取未定义的属性(读取'1')'
问题描述
我使用以下功能:
const useApi = url => {
const [data, setData] = useState([]);
const [isLoaded, setIsLoaded] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = () => {
axios
.get(url)
.then(response => {
setIsLoaded(true);
setData(response.data);
})
.catch(error => {
setError(error);
});
};
fetchData();
}, [url]);
const obj = {error, isLoaded, data}
return obj
//return { error, isLoaded, data}
}
我称之为:
const obj = useApi("http://localhost:1337/home")
以下是obj
返回的内容:
{
"error": null,
"isLoaded": true,
"data": {
"id": 1,
"published_at": "2021-09-08T11:33:42.926Z",
"created_at": "2021-09-08T11:33:41.281Z",
"updated_at": "2021-09-08T11:33:42.943Z",
"Een": [
{ "id": 1, "title": "asdasd", "content": "asdasd" },
{ "id": 2, "title": "asdasdas", "content": "asdas" },
{ "id": 3, "title": null, "content": null }
]
}
}
然后我将显示特定数据与obj.data.field
. 这完美地工作。然后我在使用obj
like时添加一个索引obj.data.field[0]
。保存文件后,React 编译它,因为我使用了 React 的 useEffect ,所以 DOM 得到更新而无需刷新浏览器。数据按应有的方式正确显示。但是,一旦我刷新浏览器,我就会收到以下错误:
TypeError: Cannot read properties of undefined (reading '1')
因此obj.data.field
,刷新时也可以获取类似的数据。但是只要我添加一个索引,obj.data.field[0]
它就只在 React 编译我的代码和 DOM 更新时才有效。但是当我用相同的编译代码刷新浏览器时,我得到了错误。
解决方案
您在纯函数中使用了 setter 函数/useEffect,它看起来很奇怪。
看一个例子 我已经为你准备好了
import "./styles.css";
import { useState, useEffect } from "react";
import axios from "axios";
export default function App() {
const [data, setData] = useState([]);
const [isLoaded, setIsLoaded] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = (url) => {
axios
.get(url)
.then((response) => {
setIsLoaded(false);
setData(response.data);
})
.catch((error) => {
setError(error);
});
};
fetchData("https://api.github.com/users");
}, []);
if (isLoaded) return <h1>Loading. . .</h1>;
if (error) return <h1>Error. . .</h1>;
return (
<div className="App">
<ul>
{data &&
data.length > 0 &&
data.map(({ login }) => {
return <li>{login}</li>;
})}
</ul>
</div>
);
}
提示: 尝试使用Async Function
以提高效率。
推荐阅读
- mysql - 优化计算日期时间差的查询
- excel - 将 Excel 中的行转置为 Word 文档表
- python - 如何仅为 python2 安装软件包?
- python - Python + Selenium,SyntaxError:在python中创建列表时无法分配给比较
- c - TI MSP432P401 板的位带别名偏移地址
- python - 给定条件在 Pandas 数据框中查找最近的日期
- python - 遍历多个文本文件的每一行,对 Python selenium 中的每个线程都是唯一的
- php - 如何在 Wordpress 插件上调试 Google Drive API 500 错误?
- java - Apache Camel:从消息正文中提取队列名称
- mysql - MySQL - 从两列中选择不同的值