javascript - 子动态组件内的 API 不获取数据
问题描述
我有一个 api (photoFetch),它从在线 JSONplaceholder 获取包含照片数据的 JSON。它位于我的子组件内部,即基于id的动态组件(父组件是我的主页)
userPhotoPage.js(子组件)
export const UserPhotoPage = async ({match}) => {
const [data, setData] = useState("");
const photoFetch = await fetch('https://jsonplaceholder.typicode.com/photos')
.then(res => res.json())
.then(result => setData(data.albums))
.catch(error => console.log("error"))
const userPhoto = photoFetch.find((userPhoto) =>{
return parseInt(match.params.id) == userPhoto.id
})
return <>
{match.isExact && <>
<h1>{userPhoto.title}</h1>
<p>image = {userPhoto.url}</p>
</>}
</>
}
我还尝试将其包装在 try catch 语句中,但没有任何效果。它不获取数据,我总是得到一个“(TypeError):无法读取未定义的属性'find'”,因为我的const userPhoto没有从photoFetch.find((userPhoto)获取任何数据。我是REACT的新手所以我真的不知道如何着手解决这个问题。已经研究了一段时间了。
我能够在我的父组件(主页)上使用用户 JSON 获取数据,并且我使用了一种非常相似的方法。我正在尝试为我的子组件重新创建它,但它不起作用。这是它在主页上的样子。(我只在这里发布一段代码,顶部)
homePage.js(父组件,只是一个例子)
class homePage extends Component {
constructor(props) {
super(props);
this.state = {
users: [],
isLoading: false,
search: ""
};
}
async componentDidMount() {
this.setState({isLoading: true});
await fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(result => this.setState({users: result}))
.catch(error => console.log("error"))
}
再次感谢堆栈溢出帮助像我这样的菜鸟!
解决方案
当你做const photoFetch = await (...)
你的代码等待得到承诺的结果并用它设置 const 的值。但是,您的 promise 没有返回任何内容,因为 last 的主体.then()
执行了一个 void 操作,该操作只是通过调用来更改钩子“数据”的值setData(...)
。这就是为什么您的错误说“无法读取未定义的属性'find'”:photoFind 在那个时候没有分配值。
您应该在最后一个箭头函数中返回一个值,.then()
以便将该值设置为常量。(我不知道你正在使用的 API,所以我不确定这个值应该是什么。也许你的 userPhoto 正试图在你的钩子中搜索一个名为 data 的值?)
PD:我还建议您记住在isLoading
获取结果或在主页的方法中捕获错误时再次将值设置为false ComponentDidMount
!
推荐阅读
- python - 从维基百科抓取链接
- vue.js - 如何在Vue.JS中将数组放入多选中
- ios - UI标签读取为零?
- javascript - 在不使用循环、内置方法或 javascript 中的 .length 属性的情况下查找字符串的长度?
- oracle - 为什么使用count时bridge sql developer命令失败
- c# - C# 异步函数投影到属性
- linux - 如何使用 Golang 安装 Gin
- javascript - Mocha - Chai Unit Terst 报告生成 - NodeJS
- swift - SwiftUI,为什么部分视图没有刷新?@State 变量未更新
- audio - Electron MediaRecorder 仅从当前窗口录制音频