【问题标题】:React js simple get json and list contents "TypeError: this.state.items.map is not a function"React js 简单获取 json 并列出内容“TypeError:this.state.items.map 不是函数”
【发布时间】:2018-05-03 00:23:23
【问题描述】:

我是 React js 的新手,而不是 javascript 开发人员,但我可以破解我的解决方案。

我有提供简单数组的 Django API url。我可以成功地使用axios.get 来检索 url json。但我不知道如何使用map 将数组内容呈现为一个简单的列表。

我收到"TypeError: this.state.items.map is not a function"

我的代码:

import React from 'react';
import axios from 'axios';
import './App.css';

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            items: []
        };
    }

    componentDidMount() {
        axios.get('http://localhost:8800/?format=json')
          .then(result => {
            this.setState({ items: result.data });
          });

    }

    render () { 
        return <ul>
          {this.state.items.map(item =>
            <li>{item} </li>)}
        </ul>
    }
}

export default App;

axios.get的回复是这样的:

{
"users":"http://localhost:8800/users/?format=json",
"photos":"http://localhost:8800/photos/?format=json",
"teams":"http://localhost:8800/teams/?format=json"
}

我想将其呈现为 HTML 列表:

users - http://localhost:8800/users/?format=json,
photos - http://localhost:8800/photos/?format=json,
teams - http://localhost:8800/teams/?format=json

解决方案似乎是重写这部分代码。

render () { 
    return <ul>
      {this.state.items.map((item, i) =>
        <li key>{item} </li>)}
    </ul>
}

我见过许多类似的问题和答案,但不同的情况有很多令人惊讶的种类,但没有一个适用于我的具体情况。

谁能指出:

a) 我错过了什么和 b) 它与什么一般的 React 和/或 javascript 原则相关,以及 c) 任何我可以自己理解的文档?

【问题讨论】:

  • 您在The json array is like this: 中发布的内容实际上是一个对象,而对象没有map 功能。请发布从http://localhost:8800/?format=json 收到的回复示例。因此,您可能需要将渲染函数更改为 this.state.items.users.map....
  • 另外,我认为您实际上并没有解析 JSON。我认为在您的axios.get 命令之后和您之前setState 之前应该有一个.then(response =&gt; response.json())
  • 正如@AlexandrFedotov 已经说过的那样,您的 API 结果是一个对象而不是数组,并且为了遍历对象并呈现它,您可以在结果上使用 Object.keys() 函数映射。请参阅此答案以供参考stackoverflow.com/questions/43721168/…
  • 更新了帖子以反映我所说的 JSON 实际上是来自 axios.get 的响应。好的,所以我的响应不是 JSON,而是一个对象。将尝试 Object.keys() 循环并呈现响应。

标签: javascript arrays reactjs


【解决方案1】:

你可以map对象键

Object.keys(this.state.items) 将返回一个键数组["users", "photos", "teams"] 然后你可以map 这个数组

在渲染组件之前加载数据会更好

https://jsfiddle.net/qnqeL65b/

componentDidMount() 更改为componentWillMount()

render () { 
    return (
        <ul>
        {
            Object.keys(this.state.items).map(key => {
                return (
                    <li>
                        {key} - {this.state.items[key]}
                    </li>
                )
            }
        }
        </ul>
    )
}

Array.prototype.map() docs

Object.keys() docs

【讨论】:

  • 我收到消息 `'key' is not defined` for line {key} - {this.state.items}
  • 我做了一些改动(忘记了&lt;ul&gt;标签之后和&lt;/ul&gt;之前的大括号)并在jsfiddle上添加了一个例子
  • 好的,映射对象键有效(即使使用 componentDidMount )。请注意,jsfiddle 具有正确的大括号和括号,例如,在 &lt;/li&gt; 之后应该是 }) 而不是 )}
【解决方案2】:

正如其他人所说,Object 没有地图功能。相反,您可以这样做:

Object.keys(this.state.items).map((key, index) => {
   // do something
});

或者您也可以使用for in 循环:

for (let key in this.state.items) {
    // do something
}


如果您正在寻找 key, value 访问权限,请尝试一下。

const obj = { 
  "first": "hello", 
  "second": "goodbye"
};

for (const [key, value] of Object.entries(obj)) {
  console.log(`${key}, ${value}`);
}

// "first, hello"
// "second, goodbye"

【讨论】:

  • “key”和“index”不是一回事吗?我看到其他示例使用不同的术语,例如 Object.keys(value).map((val, k) 其中 val = value 和 k = key。你的意思是“键”=值和“索引”=键吗?
  • 好吧,自己回答。对于其他人,从here 可以使用带有可选属性列表的数字括号 {...} 创建对象。属性是“键:值”对,其中键是字符串(也称为“属性名称”),值可以是任何东西。
猜你喜欢
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2020-09-20
  • 2017-02-16
  • 2018-09-03
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
相关资源
最近更新 更多