如何将JSON对象获取到React组件?

时间:2019-03-21 06:09:23

标签: javascript reactjs

我用AXIOS创建了一个React App。我需要从后端获取一些JSON数据,并使用该数据更改State。 当我获得对象并映射到我的状态时,状态仅是为对象的最后一个元素设置的。所以我只能看到状态中的最后一个元素。如何使所有元素都进入状态?

我的API调用如下

API.post('viewallusers', [], config)
      .then(({ data }) => {
        const allUsers = data.response.AllUsers;
        allUsers
          .map(user => {
            return (
              this.setState({
                data: [
                  createData(
                    user.name,
                    user.id,
                    user.email
                  )
                ]
              })
            )
          })
      })
      .catch((err) => {
        console.log("AXIOS ERROR: ", err);
      })

JSON数据:

{response :
  {AllUsers :
    0 : {name: "Amy", id: 1, email: "myEmail1"},
    1 : {name: "Doris", id: 2, email: "myEmail2"},
    2 : {name: "Jase", id: 3, email: "myEmail3"}
  }
}

我希望状态“数据”的设置如下:

data : [
  createData("Amy",1,"myEmail1"),
  createData("Doris",2,"myEmail2"),
  createData("Jase",3,"myEmail3")
]

但是获取JSON数据后的实际状态是

data : [
  createData("Jase",3,"myEmail3")
]

我该如何解决?

2 个答案:

答案 0 :(得分:1)

可能是因为setState没有进行深度合并。因此,如果您处于状态

state = {
    key1: 123,
    key2: {
        test1: 1,
        test2: 2

    }

}

然后你

this.setState({
    key2: {
        test1: 4
    }

})

您最终会得到

state = {
    key1: 123,
    key2: {
        test1: 4
    }

} 

您必须改为:

this.setState((ps) => ({
    key2: {
        ...ps.key2,
        test1: 4
    }

}));

如果key2的值是数组,则类似方法有效。或者,您可以先映射所有数据,然后按照其他答案的建议进行setState

答案 1 :(得分:1)

您需要先映射数据,然后设置整个状态。

API.post('viewallusers', [], config)
  .then(({ data }) => {
    this.setState({
      data: data.response.AllUsers.map(user => (createData(user.name, user.id, user.email)))
    })
  })

或使用setState的回调版本并手动合并state.data(在这种情况下不建议使用)

API.post('viewallusers', [], config)
  .then(({ data }) => {
    data.response.AllUsers.forEach(user => {
      this.setState(prev =>
        ({...prev, data: [prev.data, createData(user.name, user.id, user.email)]})
      )
    })
  })