首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ReactJS和fetch-api访问和显示JSON时出错

使用ReactJS和fetch-api访问和显示JSON时出错
EN

Stack Overflow用户
提问于 2019-12-04 19:40:44
回答 2查看 38关注 0票数 1

谢谢大家的帮助!

我看过几个类似的问题,但一直无法推断出他们的答案来解决我的问题。

我正在使用一个ReactJS应用程序来使用网站上的JSON。我正在使用来自https://pusher.com/tutorials/consume-restful-api-react的代码,并修改它以适应我的情况。

当前,当我查看index.js时,会得到错误"TypeError: assetList.assets是未定义的“。考虑到下面的JSON和代码,我需要更改什么来显示资产及其属性的列表?

我希望像这样的东西看起来像下面想要的显示。

想要的显示。

代码语言:javascript
复制
There are two 2 assets:<br/>
  id: 1317 Filename: PROCESS_FLOW.pdf  
  id: 1836 Filename: 004527_FS.jpg

JSON从网站消费

代码语言:javascript
复制
{"totalNumberOfAssets":2,
"assets":[
  {"id":"1317","attributes":{"Filename":["PROCESS_FLOW.pdf"]}},
  {"id":"1836","attributes":{"Filename":["004527_FS.jpg"]}}
]}

组件/assetList.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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'));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-04 19:57:46

在第一次呈现时,this.state.assetList的值是一个数组:

代码语言:javascript
复制
state = {
    assetList: []
};

但是,您要将它传递到<AssetList>中。

代码语言:javascript
复制
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>中的方式

代码语言:javascript
复制
state = {
    assetList: {
        assets: []
    }
};

和/或更改<AssetList>组件以正确检查其支柱:

代码语言:javascript
复制
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>
  )
};
票数 1
EN

Stack Overflow用户

发布于 2019-12-04 19:52:51

之所以会发生这种情况,是因为您的组件/assetList.js试图在没有定义assetList.assets的情况下访问assetList.assets.map上的This。

当发出API请求且尚未返回时,assetList上的资产尚未定义,因为assetList on App.js被初始化为空数组。

您可以用assetList.assets && assetList.assets.map(...)替换组件/assetList.js上的行,这应该可以做到这一点

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59183541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档