這裡拜歐先用 Node JS開一個網頁伺服器,主要是因為若用JavaScript去對上述的API送要求的話,會有Cross Domain呼叫的問題,會比較麻煩,所以這裡就用Node在伺服器送出要求,取回所需要的資料。
先寫一支名為
server.js
的程式:
var path = require('path'); var express = require('express'); var bodyParser = require('body-parser'); var app = express(); var request = require('request'); app.set('port', (process.env.PORT || 9999)); app.use('/', express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); app.get('/api/comments', function(req, res) { res.end('abc'); }); app.get('/youbike/:pageSize/:offset', function(req, res){ var pageSize = req.params.pageSize, offset = req.params.offset; request('http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=ddb80380-f1b3-4f8e-8016-7ed9cba571d5&limit=' + pageSize + '&offset=' + offset, function(err, response, body){ if(err) { console.log(err); } else if(response.statusCode == 200) { res.end(body); } }) }); app.listen(app.get('port'), function() { console.log('Server started: http://localhost:' + app.get('port') + '/'); });上列程式中,會用到Express這個Framwork,以及request這個package,它主要的功能就是在受到用戶端的要求時,再組成查詢的URL向API送出要求,取回JSON格式的資料。
再來會有一支名為
index.html
的HTML程式來顯示資料:
<!DOCTYPE html> <html> <head> </head> <body>那我們主要的 React是寫在</body> </html>
youbiks.jsx
中,其中主要定義了YouBikeSite
、YouBikeSiteRow
和YouBikeTable
等三個元件:
var YouBikeSite = React.createClass({ getInitialState : function(){ return { site : [], }; }, render : function(){ var site = this.props.site; return (完整的範例可以到 GitHub下載。); } }); var YouBikeSiteRow = React.createClass({ render : function(){ console.log('YouBikeSiteList'); return ({site.sno}{site.sarea}{site.sna}{site.sbi}{site.mday}{this.props.siteList.map(function(site) { //console.log(site); return (<YouBikeSite site={site} />); })}); } }); var YouBikeTable = React.createClass({ getInitialState : function(){ return { siteList : [], page : 1 }; }, componentDidMount : function(){ this.loadYouBikeSiteInfo(); }, loadYouBikeSiteInfo : function(){ console.log('this.state.page: ' + this.state.page); var pageSize = 10, offset = (this.state.page >= 1 ? this.state.page - 1 : 0) * pageSize; console.log(offset); var youBikeSiteUrl = '/youbike/' + pageSize + '/' + offset; $.ajax({ url : youBikeSiteUrl, dataType : 'json', cache : false, success : function(data){ if(data.result && data.result.results) { this.setState({ siteList : data.result.results }); } //console.log(this.state.siteList); }.bind(this), error : function(xhr, status, err){ console.error(youBikeSiteUrl, status, err.toString()); }.bind(this) }); }, nextPage : function() { this.state.page += 1; this.loadYouBikeSiteInfo(); }, previousPage : function() { this.state.page -= 1; if(this.state.page < 0) { this.state.page = 0; } this.loadYouBikeSiteInfo(); }, render : function(){ return () } }); ReactDOM.render( <YouBikeTable />, document.getElementById('container') );YouBike Site Information
<YouBikeSiteRow siteList={this.state.siteList}/>場站代號場站區域場站名稱目前車輛數資料更新時間
沒有留言:
張貼留言