如何修复基于 JSON 响应填充 React 组件?

Posted

技术标签:

【中文标题】如何修复基于 JSON 响应填充 React 组件?【英文标题】:How to fix populating React components based on JSON response? 【发布时间】:2017-04-21 10:22:30 【问题描述】:
 var prices = [];
      $.getJSON("http://www.asterank.com/api/asterank?query=%22neo%22:%22$lt%22:%22Y%22,%20%22price%22:%22$gt%22:100000000&limit=1000", function(data) 
        $.each(data, function(key,value) 
          prices.push(value.price);
        );
      );

var App = React.createClass(
   render() 

   return(
     <div className="app">
       <div>
        console.log("logging price array")
        console.log(this.props.priceData)
        this.props.priceData.map(p => <PriceColumn price=p />)
       </div>
    </div>
   )
  
);

var PriceColumn = React.createClass(
  render() 
    return(
    <div>
        <h4>this.props.price</h4>
    </div>
    )
  
)

ReactDOM.render(<App priceData=prices/>, document.getElementById('container'));

我正在尝试使用 json 响应填充反应组件。这是“this.props.priceData”的console.log的简短sn-p

Array[871]
[0 … 99]
0:
525905281.52797025
1:
604514917.0552349
2:
696637551.9520638
3:
875462960.8222823
4:
1267502400
5:
1332894080
6:
1467819274.5386994
7:
1498253120
8:
1703699200
9:
1743786240
10:
1864047360
11:
2725918720
12:
3191380043.7561345
13:
3652885251.1255836
14:
4587566603.506

每次我尝试访问该区域中的数据点时,我都无法定义。谢谢您的帮助!

【问题讨论】:

【参考方案1】:

$.getJSON 是异步的,因此当您在 React.render 方法中使用价格时,您的回调尚未执行。更好的方法是让组件本身负责调用,并使用回调将返回的价格存储在其状态中。例如

var App = React.createClass(
   getInitialState() 
     return 
       priceData: []
     
   ,

   componentWillMount() 
     const apiUrl = "http://www.asterank.com/api/asterank?query=%22neo%22:%22$lt%22:%22Y%22,%20%22price%22:%22$gt%22:100000000&limit=1000";

     $.getJSON(apiUrl, data => 
        this.setState(
           priceData: data.map(item => item.price)
        );
      );    
   ,

   render() 
     return(
       <div className="app">
         <div>
           this.state.priceData.map(p => <PriceColumn price=p />)
         </div>
       </div>
     )
  
);

var PriceColumn = React.createClass(
  render() 
    return(
    <div>
        <h4>this.props.price</h4>
    </div>
    )
  
)

ReactDOM.render(<App />, document.getElementById('container'));

另外,在 React 应用程序中通常没有必要使用 JQuery。如果您只将它用于 AJAX 调用,那么您可以将 browser fetch api 与不支持的浏览器的 polyfill 一起使用,或者使用更轻量级的库,例如 Axios

【讨论】:

需要使用getIntialState方法,构造函数是es6类语法方法 太棒了,这完全有道理。谢谢【参考方案2】:

您的代码的问题是 React 组件在收到您的数据时不呈现,它仅在调用 ReactDOM.render 并且当时价格是一个空数组时呈现

这样做

// you can use promises too instead of simply a callback argument
fetchPrices(callback) 
  $.getJSON("<api_endpoint>", function(data) 
    var result = Object.keys(data).map(function(key) 
      return data[key].price;
    );

    callback(result);
  );


var App = React.createClass(
   getInitialState: function() 
     return  prices: [] ;
   ,
   componentDidMount() 
     fetchPrices(function(result) 
       this.setState( prices: result );
     );
   ,
   render() 
     return (
       <div className="app">
         <div>
           this.props.priceData.map(p => <PriceColumn price=p />)
         </div>
       </div>
     );
   
);

var PriceColumn = React.createClass(
  render() 
    return(
    <div>
        <h4>this.props.price</h4>
    </div>
    )
  
)

ReactDOM.render(<App priceData=prices/>, document.getElementById('container'));

【讨论】:

这帮助我更多地理解了这个概念,我真的很感激。

以上是关于如何修复基于 JSON 响应填充 React 组件?的主要内容,如果未能解决你的问题,请参考以下文章

基于Express 在服务端渲染React组件

如何修复 JSON 不填充我的 UITableView?

React 新手 - 我如何着手修复/改进这个组件?

如何在 React 中用 JSON 数据填充下拉列表?

如何修复React-Native中的“路由组件'Principal'必须是React组件”错误

如何修复 React 应用程序中 Angular Web 组件的 CSS 问题?