React,Typescript - 打印获取的数据
React, Typescript - Print fetched data
我正在尝试从获取的 JSON 中打印数据,但不知为何我做不到。
interface IFetched {
fetchedData: any;
error: any;
}
export default class Testing100 extends React.Component<
ITesting100Props,
IFetched,
{}
> {
constructor(props: ITesting100Props) {
super(props);
this.state = {
error: null,
fetchedData: [],
};
}
public componentDidMount() {
fetch("https://api.randomuser.me/")
.then((res) => res.json())
.then(
(result) => {
this.setState({
fetchedData: result,
});
},
(error) => {
this.setState({
error,
});
}
);
}
public render(): React.ReactElement<ITesting100Props> {
console.log(this.state.fetchedData.results);
return (
<div>
<a>
{this.state.fetchedData.map(function (fetchedDataX) {
return fetchedDataX.results[0].name.first;
})}
</a>
</div>
);
}
}
通过控制台日志,我可以打印数据。但是当我将控制台日志从 console.log(this.state.fetchedData.results);
更改为 console.log(this.state.fetchedData.results[0]);
时,我什么也得不到。甚至那个控制台日志也被调用了两次,正如你在控制台输出中看到的那样,我不知道为什么。
但我的目标是将人的名字打印到 <a>
元素中,但我不知道如何实现。希望有人能帮我解决这个问题。谢谢你的时间。
在获取发生之前考虑应用程序的状态 - fetchedData
数组为空。然后当你获取时,你将它转换成一个对象,其中一个 results
字段是一个数组。
您的代码需要能够处理这两种状态。不要尝试使用或记录您尚未首先验证实际存在的内容的字段,否则它会崩溃。
第一步是清理它,这样你就可以直接更新状态中的数组 -
您的地图无法正常工作,因为 fetchedData 有一个内部 results
字段 - 尝试 this.setState({fetchedData: result.results});
,然后 console.log(this.state.fetchedData)
.
此外,您可能还想在 render
的顶部添加一些守卫,这样当 fetchedData 为空或出错时,事情就不会崩溃:
if (this.state.fetchedData === []) return <p>"Nothing Loaded"</p>;
if (this.state.error !== null) return <p>{this.state.error.message}</p>;
至于控制台双输出,那是因为render
方法在挂载组件时先得到运行,你看到fetchedData
处的输出空,然后 componentDidMount
运行s(获取数据并更新状态)然后 React 使用新状态重新渲染,导致第二个控制台日志。
您尝试访问 .result[0]
的控制台日志失败,因为它对于第一个预取状态不存在。在记录之前检查(如果)它在那里,或者记录整个状态对象。
我正在尝试从获取的 JSON 中打印数据,但不知为何我做不到。
interface IFetched {
fetchedData: any;
error: any;
}
export default class Testing100 extends React.Component<
ITesting100Props,
IFetched,
{}
> {
constructor(props: ITesting100Props) {
super(props);
this.state = {
error: null,
fetchedData: [],
};
}
public componentDidMount() {
fetch("https://api.randomuser.me/")
.then((res) => res.json())
.then(
(result) => {
this.setState({
fetchedData: result,
});
},
(error) => {
this.setState({
error,
});
}
);
}
public render(): React.ReactElement<ITesting100Props> {
console.log(this.state.fetchedData.results);
return (
<div>
<a>
{this.state.fetchedData.map(function (fetchedDataX) {
return fetchedDataX.results[0].name.first;
})}
</a>
</div>
);
}
}
通过控制台日志,我可以打印数据。但是当我将控制台日志从 console.log(this.state.fetchedData.results);
更改为 console.log(this.state.fetchedData.results[0]);
时,我什么也得不到。甚至那个控制台日志也被调用了两次,正如你在控制台输出中看到的那样,我不知道为什么。
但我的目标是将人的名字打印到 <a>
元素中,但我不知道如何实现。希望有人能帮我解决这个问题。谢谢你的时间。
在获取发生之前考虑应用程序的状态 - fetchedData
数组为空。然后当你获取时,你将它转换成一个对象,其中一个 results
字段是一个数组。
您的代码需要能够处理这两种状态。不要尝试使用或记录您尚未首先验证实际存在的内容的字段,否则它会崩溃。
第一步是清理它,这样你就可以直接更新状态中的数组 -
您的地图无法正常工作,因为 fetchedData 有一个内部 results
字段 - 尝试 this.setState({fetchedData: result.results});
,然后 console.log(this.state.fetchedData)
.
此外,您可能还想在 render
的顶部添加一些守卫,这样当 fetchedData 为空或出错时,事情就不会崩溃:
if (this.state.fetchedData === []) return <p>"Nothing Loaded"</p>;
if (this.state.error !== null) return <p>{this.state.error.message}</p>;
至于控制台双输出,那是因为render
方法在挂载组件时先得到运行,你看到fetchedData
处的输出空,然后 componentDidMount
运行s(获取数据并更新状态)然后 React 使用新状态重新渲染,导致第二个控制台日志。
您尝试访问 .result[0]
的控制台日志失败,因为它对于第一个预取状态不存在。在记录之前检查(如果)它在那里,或者记录整个状态对象。