【问题标题】:Flux - How to initially load Store data with asynchronously fetched dataFlux - 如何使用异步获取的数据初始加载 Store 数据
【发布时间】:2015-12-07 07:28:02
【问题描述】:

使用:Vanilla React 和 Flux 火力基地

我正在努力使我的商店与实时更新保持同步,因此我一直按照本文Handling Synchronized Arrays with Real-Time Firebase Data 的说明进行操作

我已调用 WebAPI 实用程序类以获取初始数据,并将其放置在我的顶级组件的 componentWillMount 侦听器中,正如许多人所指示的那样。代码如下所示。

var MessageSection = require('./MessageSection.react');
var React = require('react');
var ThreadSection = require('./ThreadSection.react');
var ChatWebAPIUtils = require('../utils/ChatWebAPIUtils');
var ChatApp = React.createClass({

  componentWillMount: function(){
    ChatWebAPIUtils.getAllMessages(); **Here is my call to an action**
  }

  render: function() {
    return (
      <div className="chatapp">
        <ThreadSection />
        <MessageSection />
      </div>
    );
  }

});

module.exports = ChatApp;

问题是,即使我的商店会正确加载,看起来因为它是异步获取,所以会调用渲染组件,但数据仍未准备好。

在我的程序尝试呈现自身之前等待 store 初始化的传统方法是什么?

【问题讨论】:

  • 您的组件如何访问数据?他们是否使用了诸如 ChatWebAPIUtils.messages 之类的功能?

标签: asynchronous reactjs firebase flux


【解决方案1】:

您也许可以为此使用组件状态。

getInitialState() {
    return {
        messagesLoaded: false,
        messages: [],
        threads: []
    }
},
onMessagesLoaded() {
    this.setState({
        messagesLoaded: true,
        messages: ChatWebAPIUtils.messages,
        threads: ChatWebAPIUtils.threads
    });
},
componentDidMount() {
    ChatWebAPIUtils.getAllMessages(this.onMessagesLoaded.bind(this))
},
render() {
    if(!this.state.messagesLoaded) {
        return (<div className="chatapp">Loading...</div>);
    }

    return (
        <div className="chatapp">
            <ThreadSection />
            <MessageSection />
        </div>
    );
}

您将初始状态设置为消息和线程的空数组。 一旦组件挂载,你就调用你的异步函数并向它传递一个回调函数,然后它会更新组件的状态——因此导致组件(以及接收新状态的子组件)更新。只要未加载数据 - 就会显示“正在加载”消息。

也应该可以在 componentWillMount() 部分调用您的 getMessages 函数。

我猜 MessagesSection 应该只显示当前选定线程的消息。我没有在示例中考虑到这一点 - 所以你也必须在某处添加这个逻辑。

编辑:添加了有关在加载数据之前阻止渲染子组件的信息。

【讨论】:

  • 嗯。那么问题是当前 MessageSection 将尝试在 getAllMessages 将数据加载到存储之前从存储中获取它的初始状态。将所有状态保留在顶级组件中是惯例,还是有办法确保在 MessageSection 尝试获取其初始状态之前首先加载存储?
  • 好的,如果你想这样做,你可以简单地在 ChatApp 组件的 render() 函数中处理。我更新了我的答案 - 你会在状态中看到一个新的 messagesLoaded 属性,该属性也在回调函数中更新。
  • 非常感谢您的帮助。现在试试看。但是,在这种情况下,这是否意味着当调用“this.setState”时会自动更新,还是我需要从存储中触发一些发射变化?
  • 没问题 :) 只要你调用 this.setState() 组件就会自行更新,所以在这种情况下你不需要触发其他任何东西。如果您的商店中有更改 - 您可能希望再次触发 onMessagesLoaded 函数,因此当您在 getAllMessages 函数中传递它时,您可能必须在 ChatWebAPIUtils 中的某处引用它。或者你实现类似ChatWebAPIUtils.onStoreChange(this.onMessagesLoaded.bind(this))
猜你喜欢
  • 2018-04-11
  • 2021-07-07
  • 1970-01-01
  • 2019-10-29
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多