对照着jquery来学vue.js系列之配合thinkphp下拉获取分页数据
上篇文章介绍了vue.js如何ajax获取数据;
接着不可避免就遇到的是;
如何进行数据分页呢?
这里以thinkphp为示例讲解;其他场景性质一样;
示例项目:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin
示例链接:localhost/Home/Vue/web_page
项目中有张表province_city_area;
里面是全国的3000多个城市;这里就拿它做分页了;
一:thinkphp获取分页数据/Application/Home/Controller/VueController.class.php<br>
/**<br>
* 配合thinkphp分页示例<br>
*/<br>
public function page(){<br>
// 获取总条数<br>
$count=M('Province_city_area')->count();<br>
// 每页多少条数据<br>
$limit=100;<br>
$page=new \Org\Nx\Page($count,$limit);<br>
$data=M('Province_city_area')<br>
->limit($page->firstRow.','.$page->listRows)<br>
->select();<br>
echo json_encode($data);<br>
}
二:前端接收数据的核心部分;
要实现的是移动端往那种下拉就加载数据的效果;
首先是先用ready方法加载第一页的数据显示到页面中;
设置一个变量i=1;var vm=new Vue({<br>
el: '.box',<br>
data: {<br>
city: []<br>
},<br>
ready: function(){<br>
this.$http.get(url).then(function(response){<br>
this.city=response.data;<br>
})<br>
},<br>
})
然后呢;判断当滚动轴到底部的时候;
让i+1 作为get参数中的页数;
加载下一页的数据;并追加到city中;i++<br>
vm.$http.get(pageData.url+'/p/'+pageData.i).then(function(response){<br>
// 用concat把下一页的数据追加到city中<br>
vm.city=vm.city.concat(response.data); <br>
})
三:完整的html;
/tpl/Home/Vue/web_page.html<!DOCTYPE html><br>
<html><br>
<head><br>
<meta charset="UTF-8"><br>
<title>Vue 配合thinkphp分页示例</title><br>
</head><br>
<body><br>
<p></p><br>
<p></p><br>
<div><br>
<p v-for="item in city">{{item.name}}</p><br>
</div><br>
<br>
<p style="display: none;">データなし</p><br>
<br>
<vue /><br>
<スクリプト><br>
<br>
//データのURLを取得します<br>
var pageData={<br>
URL: "{:U('ホーム/Vue/ページ')}",<br>
私:1、<br>
身長: 0,<br>
オーバー: false<br>
}<br>
var vm=新しい Vue({<br>
el: '.box',<br>
データ: {<br>
都市: []<br>
}、<br>
準備完了: function(){<br>
This.$http.get(pageData.url).then(function(response){<br>
This.city=response.data;<br>
})<br>
}、<br>
})<br>
<br>
<br>
//スクロールバーの現在位置を取得します <br>
関数 getScrollTop() { <br>
var スクロールトップ = 0;
If(document.documentElement && document.documentElement.scrollTop){ <br>
scrollTop=document.documentElement.scrollTop;
}else if(document.body) { <br>
scrollTop=document.body.scrollTop;
}<br>
スクロールトップに戻る <br>
}<br>
<br>
// 現在の視覚範囲の高さを取得します <br>
関数 getClientHeight() { <br>
var clientHeight=0;
If(document.body.clientHeight && document.documentElement.clientHeight){ <br>
clientHeight=Math.min(document.body.clientHeight, document.documentElement.clientHeight);
}その他{ <br>
clientHeight=Math.max(document.body.clientHeight, document.documentElement.clientHeight);
}<br>
クライアントの高さを返します <br>
}<br>
<br>
//ドキュメントの完全な高さを取得します <br>
関数 getScrollHeight() { <br>
Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)を返します <br>
}<br>
<br>
//読み込みスタイルを追加します<br>
関数 addLoading(){<br>
varloading=document.createElement('p');<br>
Loading.className='loading'<br>
Loading.innerHTML='読み込み中...';<br>
Document.body.appendChild(loading);<br>
}<br>
<br>
//読み込みスタイルを削除<br>
関数removeLoading(){<br>
varloading=document.querySelector('.loading');<br>
Loading.parentNode.removeChild(loading);<br>
}<br>
<br>
// 読み込みをデータなしに変更します<br>
関数loadingToOver(){<br>
varloading=document.querySelector('.over');<br>
Loading.style.display='ブロック';<br>
}<br>
<br>
//スクロールイベントを聞く<br>
window.onscroll=function() {<br>
If (pageData.over) {<br>
戻るfalseを返します。
}<br>
If (getScrollHeight()-(getScrollTop()+getClientHeight())
// ページ数 +1<br>
ページデータ.i++<br>
//読み込み中を表示<br>
addLoading();<br>
// 次のページのデータを取得します<br>
vm.$http.get(pageData.url+'/p/'+pageData.i).then(function(response){<br>
RemoveLoading();<br>
If(response.data.length==0){<br>
pageData.over=true;<br>
loadToOver();<br>}その他{<br>
vm.city=vm.city.concat(response.data);
}<br>
})<br>
}<br>
}<br>
<br>
<br>
</スクリプト><br>
</body><br>
</html><br>これは単にデータをロードするドロップダウン機能を実装しただけです;
上記の長いコードを怖がらないでください;
それらの多くはネイティブ JS を使用してスクロール軸監視イベントを実装しています
ビジネスに応じて読み込みと読み込みのスタイルを設計するだけです
わかりました、最近いくつかのことが原因で体調が悪くなっています
何日も遅れていたこの記事もようやく完成しました
詳細については、ソース コードとコメントを直接参照してください。
バイ・ジュンヤオのブログ http://baijunyao.com/article/88