這裡拜歐先用 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>
</body>
</html>
那我們主要的
React是寫在youbiks.jsx中,其中主要定義了YouBikeSite、YouBikeSiteRow和YouBikeTable等三個元件:
var YouBikeSite = React.createClass({
getInitialState : function(){
return {
site : [],
};
},
render : function(){
var site = this.props.site;
return (
{site.sno}
{site.sarea}
{site.sna}
{site.sbi}
{site.mday}
);
}
});
var YouBikeSiteRow = React.createClass({
render : function(){
console.log('YouBikeSiteList');
return (
{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 (
YouBike Site Information
場站代號
場站區域
場站名稱
目前車輛數
資料更新時間
<YouBikeSiteRow siteList={this.state.siteList}/>
)
}
});
ReactDOM.render(
<YouBikeTable />,
document.getElementById('container')
);
完整的範例可以到
GitHub下載。
沒有留言:
張貼留言