使用 ReactJS 和 fetch-api 访问和显示 JSON 时遇到问题
Trouble accessing and displaying JSON using ReactJS and the fetch-api
感谢大家的帮助!
我看过几个类似的问题,但无法推断出他们的答案来解决我的问题。
我正在使用 ReactJS 应用程序从网站使用 JSON。我正在使用 https://pusher.com/tutorials/consume-restful-api-react 中的代码并对其进行更改以适合我的情况。
Currently, when I view index.js, I get the error "TypeError:
assetList.assets is undefined." Given the the JSON and code below, what do I need to change to
display a list of the assets and their properties?
我希望显示类似于下面的所需显示。
所需的显示。
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"]}}
]}
components/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'));
发生这种情况是因为您的 components/assetList.js 试图访问 assetList.assets.map 上的 assetList.assets 而未定义它。
当API请求未返回时,由于App.js上的assetList初始化为空数组,assetList上的assets还没有定义。
您可以将 components/assetList.js 上的行替换为 assetList.assets && assetList.assets.map(...)
,这样就可以了
在您的第一次渲染中,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: []
}
};
And/or 更改您的 <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>
)
};
感谢大家的帮助!
我看过几个类似的问题,但无法推断出他们的答案来解决我的问题。
我正在使用 ReactJS 应用程序从网站使用 JSON。我正在使用 https://pusher.com/tutorials/consume-restful-api-react 中的代码并对其进行更改以适合我的情况。
Currently, when I view index.js, I get the error "TypeError: assetList.assets is undefined." Given the the JSON and code below, what do I need to change to display a list of the assets and their properties?
我希望显示类似于下面的所需显示。
所需的显示。
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"]}}
]}
components/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'));
发生这种情况是因为您的 components/assetList.js 试图访问 assetList.assets.map 上的 assetList.assets 而未定义它。
当API请求未返回时,由于App.js上的assetList初始化为空数组,assetList上的assets还没有定义。
您可以将 components/assetList.js 上的行替换为 assetList.assets && assetList.assets.map(...)
,这样就可以了
在您的第一次渲染中,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: []
}
};
And/or 更改您的 <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>
)
};