【问题标题】:ERR: obj are not valid as react childERR:obj 作为反应子无效
【发布时间】:2021-06-21 13:44:51
【问题描述】:

我正在使用带有 websocketserver 后端的 create-react-app。我收到错误消息“对象作为 React 子级无效(找到:带有键 {id, status} 的对象)。如果您要呈现子级集合,请改用数组。”

我的后台

          std::string out = "[{\"id\": \"" + Event->getID().asString() + "\",";
          if (auto stateEvent = dynamic_cast<const StateReport*>(Event.get()))
          {
            out += "\"State-Event\": \"";
            out += stateToString(stateEvent->getState());
            out += "\"}]";
          }
          else
            out += "\"Unknown event\": \"\"}]";

          out += "\n";

          objcomm::Data resp;
          resp._data = (const std::uint8_t*)out.c_str();

反应代码

componentDidMount() {
    client.onmessage = (message) => {
      var data = message.data;
      this.setState({dataFromServer: data});
      console.log(message.data);
    };
  }

  render() {
    if(!this.state.dataFromServer){
      return "loading"
    }
    else if(this.state.dataFromServer && this.state.dataFromServer.length >0){
      return(
        this.state.dataFromServer.map(data => (
          {data}
        ))
      );
    }
  }

message.data 的控制台日志

  [{"id": "1.2","State-Event" : "Running"}]

我想访问类似的东西 this.state.datafromServer.map(data => {data.id}) 但是当我这样做时,我得到 datafromServer.map 不是函数

我做错了什么。

【问题讨论】:

    标签: javascript arrays json reactjs


    【解决方案1】:

    很可能,在第一次执行render() 期间,this.state.dataFromServer 的值仍然是undefined,这解释了 “datafromServer.map 不是函数” 错误。

    在下一次 render() 执行期间,它应该已经设置(由于 API 已被调用),然后您就可以使用它了。

    这是一种很常见的情况。请参阅下面的示例,了解如何处理它:

    render() {
      if (!this.state.dataFromServer)
        return <p>Loading...</p>;
    
      return this.state.dataFromServer.map(item => this.createElement(item));
    }
    

    this.createElement 在这里只是一个示例,您可以自行实现它,或者对每个item 执行其他操作。一个非常简单的(入门)实现可能是:

    createElement = (item) => <p>id: {item.id}</p>
    

    【讨论】:

    • 啊是的可能是!让我试一试。我忘了我必须检查它是否存在。
    • 不,它没有帮助。我仍然有错误。
    • 在您更新的代码中,map 调用中的函数返回 {data},它是一个 javascript 对象。它应该返回一个 JSX 元素(例如 &lt;p&gt;&lt;span&gt;&lt;div&gt;),就像我在示例代码中所做的那样。
    • 是的,我试过了,我也在控制台中进行了调试,看看我在 this.state.dataFromServer 中得到了什么值,我得到了这个。 this.state.dataFromServer "[{\"id\": \"1.2\",\"State-Event\": \"Running\"}]\n"
    • 看起来您的数据可能是双重编码的。您的后端会创建一个包含 JSON 的字符串,然后由后端框架再次将其编码为 JSON。然后在前端执行 JSON.parse() 之后,您仍然会得到一个包含 JSON 的字符串。您可以再次运行 JSON.parse() 以从中获取数据,但实际上最合适的解决方案是在后端构造一个 object ,其中包含作为实际数据属性的数据,而不是创建一个模仿这样一个对象的字符串。
    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多