【问题标题】:ReactJS with Sockets Nested JSON parsing data issue带有套接字的 ReactJS 嵌套 JSON 解析数据问题
【发布时间】:2018-08-16 02:31:08
【问题描述】:

我有一个 JSON 文件,其结构类似于“data.json”

{
    "Object1": {
        "name": "1",
        "rank": "2"
    },
    "Object2": {
        "name": "3",
        "rank": "4"
    }
}

在我的 React 代码中,我有我的数据来设置我的反应状态。我想将 Object2 传递给不同的组件,但我似乎无法区分数据。

// import packages
import React, { Component } from "react";
import io from 'socket.io-client';

class App extends Component {
    constructor() {
        super();

        this.state = {
            data: null
        };
        this.socket = io('http://localhost:5000');

        // Binders
        this.updateState = this.updateState.bind(this);
    }

    componentDidMount() {
        this.socket.on('send data', this.updateState);
    }

    updateState(result) {
        this.setState({
            data: result
        });
    }

    render() {
        return (
            <p style={{ textAlign: "center" }}>
                {this.state.data}
            </p>
        );
    }
}

export default App;

当我尝试引用 this.state.data 或 this.state.data.Object1.name 之类的内容时,它指向一个空对象。我究竟做错了什么?

【问题讨论】:

  • 在您的 render 方法中将 console.log(this.state) 放在 return 之前。你在第二个渲染中看到了什么?此外,您不能直接将对象渲染到 DOM 中。这不起作用:{this.state.data}.
  • @devserkan 我在空白主页和控制台中看到了数据。为什么 this.state.data 不起作用?它有效,但不是我试图让它工作的方式。我将所有内容都通过套接字进行管道传输,以便一次完全更新应用程序。
  • 是不是因为不是Object1而是Object11
  • @azium 这只是一个错字。这并没有什么不同。 gyazo.com/150dd6bd270513982357022d7dc73570
  • 哦,您的屏幕截图中的错误与您所说的不同。不是说Object1 为空,而是说data 为空。 @devserkan 答案是正确的

标签: json reactjs setstate


【解决方案1】:

我对套接字知之甚少,但由于您是在第一次渲染后设置状态,所以在componentDidMount 完成其工作之前没有任何数据。所以,你需要条件渲染。

const data = {
  "Object1": {
    "name": "1",
      "rank": "2"
  },
  "Object2": {
    "name": "3",
      "rank": "4"
  }
};

const fakeRequest = () => new Promise( resolve => 
  setTimeout( () => resolve(data), 2000 )
);

class App extends React.Component {
  state = {
    data: null,
  };

  componentDidMount() {
    fakeRequest().then( data => this.setState({data}));
  }

  render() {
    return <div>
      {!this.state.data ? "No data yet, wait 2 seconds." : this.state.data.Object1.name }
    </div>;
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

你不能使用{this.state.data},因为 React 子不能是对象。您需要使用此对象的值。

【讨论】:

  • 我知道现在的问题是什么,但我使用的是套接字,如果我从 API 中获取,这将起作用。会试着乱来看看我能做什么
  • 所以,socket.on() 是一个回调,我通过回调从那里设置状态。如何让 setState 在渲染之前完成?我想不通。
  • 这里使用套接字或从 API 获取数据有什么区别?在某些时候,你得到了正确的数据?我想它会像溪流一样来。因此,条件渲染应该可以工作。您不能让setState 在第一次渲染之前完成或以任何方式暂停渲染。您的组件在componentDidMount 之前安装并命中第一个渲染。这就是我们在这里使用条件渲染的原因。
  • 非常正确。我回家后一定要试试这个。我相信你的回答是对的。这在逻辑上是有道理的,只是我的实现是错误的,我现在意识到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多