无需等待 React JS 中的 API 数据即可进行渲染

Posted

技术标签:

【中文标题】无需等待 React JS 中的 API 数据即可进行渲染【英文标题】:Rendering happens without waiting for API data in React JS 【发布时间】:2016-09-24 05:09:42 【问题描述】:

我是 ReactJS 的新手,我正在创建单个注册页面应用程序,其中下拉数据来自 API,但是当我尝试获取数据时显示错误。

我的示例代码如下:

AppApi.js:

var AppActions =require('../actions/AppActions');
var request = require('superagent');

var Data= ;
module.exports =
        request.get('*http://api.randomuser.me/*')
      .set('Accept', 'application/json')
      .end(function(err, response) 
        if (err) return console.error(err);
           Data.details= response.text;
        AppActions.receiveData(Data.details);


      );

我的行动是:

var AppDispatcher = require('../dispatcher/AppDispatcher');
var AppConstants = require('../constants/AppConstants');
var AppActions = 
    receiveData: function(data)
      AppDispatcher.handleViewAction(
          actionType: AppConstants.RECEIVE_DATA,
          data: data
      )
  
 
module.exports= AppActions;

我的常量文件是:

module.exports =
    RECEIVE_GENDERS: 'RECEIVE_GENDERS'

调度员是:

    var Dispatcher = require('flux').Dispatcher;
    var assign = require('object-assign');
    var AppDispatcher= assign( new Dispatcher(), 
        handleViewAction :function(action)
            var payload =
                source: 'VIEW_ACTION',
                action: action
            
            this.dispatch(payload);
        
    );
   module.exports =AppDispatcher;

在我的商店中:

 var AppDispatcher = require('../dispatcher/AppDispatcher');
    var AppConstants = require('../constants/AppConstants');
    var EventEmitter =require('events').EventEmitter;
    var assign =require('object-assign');
    var AppAPI = require('../utils/appAPI.js');

    var CHANGE_EVENT ='change';
    var _data=[];
    var AppStore= assign( , EventEmitter.prototype, 
        setData: function(data)
            console.log("my Data", data);
            _data=data
    , 
         getData: function()
            //not getting data in console
            console.log("returning Data", _data);
            return _data;
        ,
         emitChange: function()
            this.emit(CHANGE_EVENT);
        ,
        addChangeListener : function(callback)
            this.on('change', callback);
        ,
        removeChangeListener: function(callback)
            this.removeListener('change',callback)
        
    );
    AppDispatcher.register(function(payload)
        var action = payload.action;
        switch(action.actionType)
              case AppConstants.RECEIVE_DATA:
                AppStore.setData(action.data);
                AppStore.emit(CHANGE_EVENT);
                break;
    
        return true;
    );

    module.exports =AppStore;

我的 Main.js 是:

var App= require('./components/App');
var React = require('react');
var ReactDom = require('react-dom');
var AppAPI = require('./utils/appAPI.js');

AppAPI.getGenders();
ReactDom.render(
    <App/>,
    document.getElementById('app')
)

我的 APP.JS 格式如下:

var React =require('react');
var AppActions = require('../actions/AppActions');
var AppStore = require('../stores/AppStore');
function getAppState()
    return
        data: AppStore.getData()
    


var App= React.createClass(
    getInitialState: function()
        console.log(getAppState().data)
        return getAppState()
    ,

    componentDidMount: function()
        AppStore.addChangeListener(this._onChange);
    , 
    componentWillUnmount: function()
        AppStore.removeChangeListener(this._onChange);
    ,
    render: function()
,
        _onChange: function()
            this.setState(getAppState());
        
);
module.exports =App;

问题: 空对象进入 console.log(getAppState().data) 因为渲染部分没有等待 ajax 数据。

请帮助我或给我一些解决这个问题的方法,自过去 3 天以来我一直在努力解决这个问题。 提前致谢

【问题讨论】:

【参考方案1】:

如果你想避免渲染一个 React 组件,因为数据还没有加载,你可以调整组件的显示方式:

return
  <div>
  
    this.state.data?
      <ComponentExample data=this.state.data/>
    :
      null
  
  </div>

还有其他方法可以调节组件渲染,例如使用stateless component,但这种方法可以正常工作。

否则,getInitialState() 中的空对象不是问题:您在第一次渲染时缺少数据是正确的,但是一旦从您的 API 中检索数据,感谢_onChange(),该组件将被重新渲染,因此可以显示ComponentExample

【讨论】:

【参考方案2】:
function getAppState()
    return
        data: AppStore.getData(),
        status:AppStore.getStatus()
    

将getStatus函数添加到AppStore

render: function()
   if(this.state.status=='loading')
       return (<div className="loading"></div>);
   if ....
   return (<RealComponent data=this.state.data></RealComponent>)
,

【讨论】:

以上是关于无需等待 React JS 中的 API 数据即可进行渲染的主要内容,如果未能解决你的问题,请参考以下文章

无需等待 API 响应即可更改图标状态。 (标记为收藏功能)

无需等待结果即可从Web API调用另一个Web API

Prisma 无需等待即可创建/更新

在发出 POST 请求之前等待来自外部 API 的数据

React/React Context API:使用 useEffect() 钩子时等待上下文值

如何使用 React.js 中的 Fetch API 将数据发布到数据库