【问题标题】:Outputting JSON data into props pulled from FireBase database将 JSON 数据输出到从 FireBase 数据库中提取的道具中
【发布时间】:2018-09-21 14:47:23
【问题描述】:

我正在尝试将一组数据从实时数据库输出到 html 元素中,我从服务器获取数据并使用 setState 保存数据没有问题。我有一个来自功能组件的自定义 HTML 对象,它将输出道具,但我无法映射对象和内部对象。

下面是负责从数据库中拉取数据的代码:

  componentDidMount() {
    axios.get('./tasks.json')
      .then(response => {
        const fetchedTasks = [];
        for (let key in response.data) {
          fetchedTasks.push({
            ...response.data[key],
            key: key
          });
        }
        this.setState((prevState, props) => {
          return {
            taskList: fetchedTasks
          }
        } )
      })
      .catch(error => console.log(error));
  }

这是我从数据库中提取的数据。我希望能够根据其名称、ID 等显示每个项目。 这是从服务器导出的 JSON 数据,这是通过 axios.get call 'Past.js' 复制到我的类组件的状态

    {
      "tasks" : {
        "09182018" : {
          "-LMgzJGM78f0BHbPf8cc" : {
            "hours" : 0,
            "id" : "2018-09-18T14:02:25.022Z",
            "minutes" : 0,
            "name" : "sadflkjdsalkf",
            "seconds" : 2,
            "start" : "2018-09-18T14:02:22.508Z"
          },
          "-LMgzaEYe0tcCjpxOuPU" : {
            "hours" : 0,
            "id" : "2018-09-18T14:03:38.635Z",
            "minutes" : 0,
            "name" : "safd",
            "seconds" : 2,
            "start" : "2018-09-18T14:03:36.353Z"
          }
        },
        "09192018" : {
          "-LMm7EoPnNdQLrZ5Rg62" : {
            "hours" : 0,
            "id" : "2018-09-19T13:59:31.361Z",
            "minutes" : 0,
            "name" : "sadf",
            "seconds" : 2,
            "start" : "2018-09-19T13:59:29.281Z",
            "user" : "placeholder"
          }
        },
        "09212018" : {
          "-LMve6ihcRX_uZfvBcaC" : {
            "hours" : 0,
            "id" : "2018-09-21T10:24:06.504Z",
            "minutes" : 0,
            "name" : "sadfsd",
            "seconds" : 2,
            "start" : "2018-09-21T10:24:03.841Z",
            "user" : "placeholder"
          },
          "-LMvnBBAWaHaBiGW5VMK" : {
            "hours" : 0,
            "id" : "2018-09-21T11:03:44.420Z",
            "minutes" : 0,
            "name" : "hello",
            "seconds" : 14,
            "start" : "2018-09-21T11:03:29.802Z",
            "user" : "placeholder"
          }
        }
      }
    }

我试图在状态上运行 .map() 调用,但没有成功,映射嵌套项会抛出“array.map 不是函数”。这是我到目前为止的代码:

render() {
let outPutItems = [];

if (this.state.loading === false) {
  outPutItems = this.state.taskList.map(array => array.map(item => {
    <CompleteTask
      id={item.id}
      taskName={item.name}/>
  })
)}

return (
  <div className="Past">
    <h1>Past Tasks</h1>
      {outPutItems}
      <button onClick={this.collectTasks}>Log the TaskList!</button>
  </div>
);
}

-更新

前三个是我能够在反应中使用的,底部是使用虚拟数据,是我希望从上面的 JSON 数据中得到的输出,它已应用于来自 firebase 服务器的状态。

top output with map method, bottom using placeholder data from state

我可以用这段代码输出前三个,上面的所有其他代码都是一样的:

      {this.state.taskList.map((outer, index) => (
        <CompleteTask
          taskName={outer.key}
        />
      ) )
    }

【问题讨论】:

  • 我在这里看不到任何嵌套数组(但您最好发布原始响应正文...它比这更容易阅读)。不就是this.state.taskList.map(item =&gt; &lt;CompleteTask ...
  • 抱歉,已经更改了一些描述,我遇到的主要问题是任务对象是从具有唯一对象 ID 的 Firebase 中提取的,例如:LMm7EoPnNdQLrZ5Rg62。我不确定如何访问该对象内的条目。
  • 啊,好吧!好吧,您需要首先提取按日期分组的任务(我假设):Object.keys(this.state.taskList).map(dateGroup =&gt; /*this.state.taskList[dateGroup] */) 以获取所有任务,然后 Object.keys() 获取 Firebase ID。或者,您可以直接使用Object.entries(),它返回带有键/值对的嵌套数组。

标签: javascript reactjs firebase firebase-realtime-database react-state-management


【解决方案1】:

这应该适合你。取自here。此外,在渲染列表之前无需检查是否为loading == false。如果列表中没有要渲染的内容,则不会渲染任何内容。此外,一旦列表被填充,它将反映在视图中。

return (
    <div className="Past">
      <h1>Past Tasks</h1>
      {this.state.taskList.map((item, index) => (
        <CompleteTask id={item.id} taskName={item.name}/>
      )}
      <button onClick={this.collectTasks}>Log the TaskList!</button>
    </div>
);

【讨论】:

  • 加载状态道具用于稍后渲染微调器。我尝试了这段代码, 呈现了三个全部为空的孩子。
  • 要渲染一个微调器或加载图标,是的,您需要检查是否loading == true,但您不需要在渲染列表之前检查是否loading == false。而且我不确定渲染三个为空的孩子是什么意思。实际获得this.state.taskList 似乎是一个问题。尝试使用本地数据填充this.state.taskList 并对其进行测试。如果它有效,您就知道您获取实际数据的方法不正确。
  • 我的意思是呈现了正确数量的集合,(您可以在上面的 JSON 中看到,“任务”中的三个日期包含唯一条目)但它们不包含数据。 key 为 null 且对象为空,而不是 null,这是不正确的。数据处于我的状态,我可以从 devtools 和 console.log() 调用中看到。我遇到的问题是,我无法将“深度”映射或传播到状态数组 taskList 中,以便输出上述 JSON 数据点,例如“名称”、“分钟”、“小时”和“开始”。跨度>
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多