【问题标题】:Object into an array then return a component - React JS Application对象放入数组然后返回一个组件 - React JS Application
【发布时间】:2018-12-03 12:14:00
【问题描述】:

晚会,各位开发者,

我重写了一个 React JS 应用程序,但我只是碰壁了。

我有一个向数据库添加一些数据的表单,特别是 Firebase 谷歌自己的基于云的数据库解决方案。但是,现在我正在尝试获取数据并渲染下面的组件,但我知道该怎么做。

我从 Firebase 收到的回复:

Response From Firebase

目前我只是记录响应以显示我确实收到了响应,我已将响应设置为空状态。在渲染时,它被设置为来自服务器的响应。

我希望现在能够将对象转换为一个数组,然后该数组可以返回一个响应数组。然后数组将被循环并转换为组件,这些组件将按照我上面指定的方式呈现在下面。

有人可以帮助我完成这项任务,因为我非常不确定如何完成这项任务。我将不胜感激任何对我的问题的答复。

Github 链接:https://github.com/AlexMachin1997/React-JS-Contact-Book 到目前为止我所拥有的:

componentDidMount () {

  axios.get("/contact.json")

  .then(response => {
      this.setState({
          contactsArray: response.data.person
      })
      console.log(this.state.contactsArray)
  })

  //Any Errors The Error State Is Set To True
  .catch (error => {
  console.log(error)
  })

}

【问题讨论】:

  • 最好在此处粘贴带有代码块的响应,并向我们展示您到现在为止的尝试?所以,你只想渲染响应对象,是吗?
  • 我已经添加了代码块来显示代码块:)
  • 我的意思是响应本身。您向我们展示了如何获取数据和设置状态。还行吧。我的回答不适合你吗?

标签: arrays reactjs object ecmascript-6


【解决方案1】:

要将响应对象转换为数组,您可以使用Object.keysObject.values

Object.values(firebaseResponse);

Object.keys(firebaseResponse).map((x) => { 
    // additional transformation
    return x;
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

【讨论】:

    【解决方案2】:

    您可以使用 Object.values 或 Object.keys 从您的对象中获取一个数组。但是如果您的 persons 对象中没有唯一 ID,则 Object.keys 更合适,因为您需要一个密钥来迭代 JSX 道具或您的组件。如果响应处于您的根状态:

      render() {
        const obj = this.state;
        return (
            Object.keys( obj ).map( objKey =>
            (
              <div key={objKey}>
                  <p>Name: {obj[objKey].persons.name}</p>
                  <p>Email: {obj[objKey].persons.email}</p>
                  <p>Phone: {obj[objKey].persons.phone}</p>
              </div>
            )
          )
        );
      }
    

    或将其传递给另一个组件:

    render() {
        const obj = this.state;
        return (
          Object.keys(obj).map(objKey =>
              <Person obj={obj} objKey={objKey} />
          )
        );
      }
    

    使用 Object.values 这会稍微干净一些,但您应该为您的键使用独特的东西。我选择了电子邮件属性,因为电子邮件是独一无二的。

      render() {
        const obj = this.state;
        return (
          Object.values(obj).map(value =>
            (
              <div key={value.persons.email}>
                <p>Name: {value.persons.name}</p>
                <p>Email: {value.persons.email}</p>
                <p>Phone: {value.persons.phone}</p>
              </div>
            )
          )
        );
      }
    

    或再次使用组件:

    render() {
        const obj = this.state;
        return (
          Object.values(obj).map(value =>
              <Person value={value} />
          )
        );
      }
    

    【讨论】:

    • 对不起所有回答这个问题的人。我完全忘记了我在这里发布了这个问题。我确实找到了解决问题的方法,最后我只是这样做了
    • const arrayOfComponents = []; for(let key in this.state.contactsArray) { arrayOfComponents.push({ id: key, config: this.state.contactsArray[key] }); } console.log(arrayOfComponents) let contacts = (
      {arrayOfComponents.map(component => ( ))}
      )
    • 但是当我从父级更新子级时我现在面临一个问题它不会重新渲染。
    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2017-08-03
    • 2017-10-10
    • 2017-05-29
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多