大家谢谢您的帮助!
我看过几个类似的问题,但无法推断出他们的答案来解决我的问题。
我正在使用ReactJS应用程序从网站使用JSON。我正在使用https://pusher.com/tutorials/consume-restful-api-react中的代码,并对其进行更改以适合我的情况。
当前,当我查看index.js时,出现错误“ TypeError:
未定义assetList.assets。”鉴于以下JSON和代码,我需要更改为
显示资产及其属性的列表?
我希望显示器看起来像下面的“所需显示器”。
所需的显示。
There are two 2 assets:<br/>
id: 1317 Filename: PROCESS_FLOW.pdf
id: 1836 Filename: 004527_FS.jpg
网站使用的JSON
{"totalNumberOfAssets":2,
"assets":[
{"id":"1317","attributes":{"Filename":["PROCESS_FLOW.pdf"]}},
{"id":"1836","attributes":{"Filename":["004527_FS.jpg"]}}
]}
组件/assetList.js
import React from 'react'
const AssetList = ({assetList}) => {
return (
<div>
There are {assetList.totalNumberOfAssets} assets:
{assetList.assets.map((asset) => (
<div>
id: {asset.id} filename: {asset.filename}
</div>
))}
</div>
)
};
export default AssetList
App.js
import React, {Component} from 'react';
import AssetList from './components/assetList';
class App extends Component {
render() {
return (
<AssetList assetList={this.state.assetList} />
)
}
state = {
assetList: []
};
componentDidMount() {
fetch('http://ligitaddress/api/v1/asset')
.then(res => res.json())
.then((data) => {
this.setState({ assetList: data })
})
.catch(console.log)
}
}
export default App;
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(<App />, document.getElementById('root'));
最佳答案
在您的第一个渲染中,this.state.assetList
的值是一个数组:
state = {
assetList: []
};
但是,您将其传递到
<AssetList>
const AssetList = ({assetList}) => {
return (
<div>
There are {assetList.totalNumberOfAssets} assets:
{assetList.assets.map((asset) => (
<div>
id: {asset.id} filename: {asset.filename}
</div>
))}
</div>
)
};
表示
assetList.assets.map
的行试图在未定义的内容上调用map()
。 (您可以在数组上访问属性assets
,它将是undefined
)似乎希望assetList
是其中包含assets
数组的对象,但是在您的父组件中,assetList
是初始化为数组...简而言之,您对自己希望存放的数据类型感到困惑。更改初始状态以反映您期望如何将其传递到
<AssetList>
:state = {
assetList: {
assets: []
}
};
和/或更改您的
<AssetList>
组件以正确检查其属性:const AssetList = ({assetList}) => {
return (
<div>
There are {assetList.totalNumberOfAssets} assets:
{Array.isArray(assetList.assets) && assetList.assets.map((asset) => (
<div>
id: {asset.id} filename: {asset.filename}
</div>
))}
</div>
)
};