React 从 json 数据迭代对象

IT技术 javascript reactjs
2021-05-15 11:02:04

我有以下代码:

import ReactDom from 'react-dom';
import React from 'react';
import {render} from 'react-dom';
import $ from 'jquery';

class News extends React.Component {
  render () {
    var news = [];
    this.props.news.forEach(function(el, i){
        news.push(<SingleNews key={i} img={el.img} />);
    });
    return (
      <section className="news-wrapper">
          {news}
      </section>
    );
  }
}

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
          data: ''
        }
    }
    mapObject(object, callback) {
      return Object.keys(object).map(function (key) {
        return callback(key, object[key]);
      });
    }
    componentDidMount () {
      const newsfeedURL = 'https://s3-eu-west-1.amazonaws.com/streetlife-coding-challenge/newsfeed.json';
      $.get(newsfeedURL, function(result) {
        this.setState({data: JSON.parse(result)});
        console.log(typeof this.state.data.messages);
      }.bind(this));
    }
    render () {
        return (
            <div>
                {Object.keys(this.state.data.messages).map(function(key) {
                    return <div>Key: {key}, Value: {this.state.data.messages[key]}</div>;
                })}
            </div>
        )
    }
}


ReactDom.render(
  <App />,
  document.getElementById('app')
);

我正在尝试迭代“this.state.data.messages”以在渲染方法中输出一些数据。

输入“console.log(typeof this.state.data.messages);”后 我收集到“this.state.data.messages”是一个对象,因此如下:

            {Object.keys(this.state.data.messages).map(function(key) {
                return <div>Key: {key}, Value: {this.state.data.messages[key]}</div>;
            })}

但是我的控制台中有以下内容:

未捕获的类型错误:无法将未定义或空值转换为对象

2个回答

这里的问题是您最初将数据设置为空字符串。在您componentDidMount进行 ajax 调用时,由于它是异步的,react 仍然会呈现。一旦它呈现,它就会尝试访问this.state.data.messagesthis.state.data是一个空字符串,因此将没有称为消息的属性。

如果this.state.loading === true在 div 中渲染其他内容,并且this.state.loading === false && this.state.data.messages实际上返回您现在尝试执行的操作,我会做的是在您的渲染方法中设置一个名为加载的初始状态属性

解析 JSON 响应时,请确保将加载状态设置为 false

this.state = {
   data: '',
   loading: true
}
componentDidMount () {
    const newsfeedURL = 'https://s3-eu-west-1.amazonaws.com/streetlife-coding-challenge/newsfeed.json';
    $.get(newsfeedURL, function(result) {
        this.setState({
          data: JSON.parse(result),
          loading: false
        });
        console.log(typeof this.state.data.messages);
    }.bind(this));
}
render () {
  let content;
  if (this.state.loading === false && this.state.data.messages) {
    content = {Object.keys(this.state.data.messages).map(function(key) {
      return <div>Key: {key}, Value: {this.state.data.messages[key]}</div>;
    })}
  } else { 
    content = ''; // whatever you want it to be while waiting for data
  }
  return (
    <div>
      {content}
    </div>
  )
}

您将在异步调用返回之前进行渲染。

你需要在有数据之前处理案例。如果不出意外,您应该更改初始状态以更好地匹配您期望的状态。