【问题标题】:How to access array in array from react component?如何从反应组件访问数组中的数组?
【发布时间】:2019-10-05 19:31:40
【问题描述】:

我有这个数组:

{
  "firstname": "Jessica",
  "lastname": "Wood",
  "favorite": {
        "movie": Flint Town,
        "drink": Sprite
  }
}

我正在尝试喝酒,但我发现 Objects are not valid as a React child found: object with keys.

我该如何解决这个问题?

我的反应组件:

import React, { Component } from 'react';
import axios from 'axios';

class Home extends Component {

  state = {
    info: []
  }

  componentDidMount() {
    axios.get('http://localhost:9000/api')
      .then(res => {
        const info = res.data;
        this.setState({ info });
      })
  }

  render() {
    return (
      <ul>
        <li>{this.state.info.favorite.drink}</li>
      </ul>
    )
  }
}
export default Home;

【问题讨论】:

  • Sprite 是字符串吗?您需要将“最喜欢”对象中的值转换为字符串或数字,否则您将无法呈现它们。
  • 嗨@slower,是infoArray 还是Object
  • @ramirozap 它是数组,当我这样做时 this.state.info.firstname 它工作正常。
  • @slower。 Flint Town 和 Sprite 似乎不是字符串。您需要将它们转换为字符串才能正常工作。

标签: javascript arrays node.js json reactjs


【解决方案1】:

您需要解析“favorite”对象中的值,以便将它们呈现为字符串。

看起来您还试图在 this.state.info 存在之前访问它。这就是为什么它给你未定义的错误。 render 方法在您将任何内容分配给 info 之前运行,您在 componentDidMount() 中执行了此操作。

要解决此问题,我们可以使用 loading-state 值来确定要显示的内容。加载状态将在您的 componentDidMount() 逻辑完成后切换,确保您的状态已填充。

这里是沙盒:https://codesandbox.io/s/bold-germain-k3f23

class Home extends Component {
  state = {
    info: {},
    loading: true
  };

  componentDidMount() {
    axios.get("http://localhost:9000//").then(res => {
      const info = res.data;
      const parsedInfo = {
        ...info,
        favorite: Object.entries(info.favorite).reduce((obj, [k, v]) => {
          obj[k] = "" + v;
          return obj;
        }, {})
      };

      this.setState({ info: parsedInfo, loading: false });
    });
  }

  render() {
    const { loading, info } = this.state;
    if (loading) {
      return <div>Loading</div>;
    } else {
      return (
        <div>
          <div>{info.favorite.movie}</div>
          <div>{info.favorite.drink}</div>
        </div>
      );
    }
  }
}

【讨论】:

  • 你好克里斯托弗,这段代码我得到了一个错误:第 7 行:'myObj' 没有定义。
  • 哦,那是我的错,我的意思是用“info”代替“myObj”。请参阅上面的编辑。谢谢@slower
  • @slower 执行上述操作有什么运气吗?如果这给您带来任何错误,请告诉我,我知道我有错字。
  • 如果我在 componentDidMount() 中执行 console.log(this.state.parsedInfo.favorite.drink) 它可以工作,但如果我将它移动到渲染函数它会给我:无法读取属性 'parsedInfo'空
  • 它有效。感谢帮助。你刚刚杀死了那个,但很遗憾在 javascript 中这样的事情是如此困难。我现在主要用 php 编写,当你像我一样是初学者时,它看起来就像地狱一样。 :D 无论如何感谢您的帮助,您做得很好。
猜你喜欢
  • 1970-01-01
  • 2019-08-25
  • 2019-12-29
  • 2018-08-09
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2021-03-30
  • 2021-12-12
相关资源
最近更新 更多