Vue+ElementUI 實現分頁功能-mysql資料
目錄
- 1.問題
- 2.解決
- 2.1分頁元件
- 2.2獲取資料的函式:getData():
- 2.3頁面載入完成,需要請求第一頁的資料
- 3.分析
- 4.結果
1.問題
當資料庫中資料比較多時,就要每次只查詢一部分來緩解伺服器和頁面的壓力。這裡使用elementui
的 Pagination 分頁 元件,配合的
limit
語句,實現分頁查詢mysql資料。
下圖是最基本的分頁樣式:
當然需要引入對應的事件,來實現頁面改變就查詢資料庫。
2.解決
2.1分頁元件
<el-pagination background layout="prev,pager,next" :page-size="8" :total="total" :current-page="pageNum" @current-change="handleCurrentChange"> </el-pagination>
data
:初始化總資料條數(total
)為1,pageNum
也就是當前頁數為第一頁。
2.2獲取資料庫資料的函式:getData():
引數為offset
,limit
,向後端請求資料,待會兒解釋。這裡使用了qs序列化引數。可以參考我的另一篇部落格: + ElementUI + Viewer
翻頁後圖片無法預覽 Vue父子元件非同步通訊問題 裡面解釋了qs的功能。
getData(offset,limit){
this.axios.post('//select.php',qs.stringoPRoHdify({
offset: offset,limit: limit,type: '失物招領'
}),{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).then((res) => {
if(res.data === 0){
this.total = 0;
this.list = [];
return;
}
this.total = res.data.total
this.list = res.data.data
this.loading = false
}).catch((err) => {
this.$message.error(err)
})
}
2.3頁面載入完成,需要請求第一頁的資料
created () { this.getData(0,8); },
頁面改變觸發handleCurrentChange()
函式,即點選了翻頁,其中val引數就是當前頁數,使用新的引數,
呼叫getData實現查詢不同頁面的資料:
handleCurrentChange(val){ this.list = [] //清空上一頁資料 this.getData((val-1)*8,8); }
下面是後端資料:php + mysql
現在資料表中總共有10條資料:
前端getData
請求的select.php
select.php:
<?php
$servername = "localhost";
$username = "使用者名稱";
$password = "密碼";
$dbname = "資料庫名稱";
// 建立連線
$conn = new mysqli($servername,$username,$password,$dbname);
// Check connection
if ($conn->connect_error) {
die("連線失敗: " . $conn->connect_error);
}
$type = $_POST['type'];
//獲取前端的引數 開始和結束number
if ( !isset( $_POST['offset'] ) ) {
echo 0;
exit();
};
$offset = ( int )$_POST['offset'];
if ( !isset( $_POST['limit'] ) ) {
echo 0;
exoPRoHdit();
};
$limit = ( int )$_POST['limit'];
//分頁查詢資料庫
$sql = "SELECT * FROM posts where type='$type' order by id desc LIMIT $limit OFFSET $offset";
$result = $conn->query($sql);
$sqlGetCount = "SELECT COUNT(*) cnt FROM posts where type='$type'";
$rescnt = $conn->query($sqlGetCount);
$rescnt = $rescnt->fetch_assoc();
$arr = array();
if ($result->num_rows > 0) {
while ( $row = $result->fetch_assoc() ) {
array_push( $arr,$row );
}
//echo on_encode( $arr,JSON_UNESCAPED_UNICODE );
echo json_encode(array_merge(array('data'=>$arr),array('total'=>(int)$rescnt['cnt'])));
} else {
echo 0;
}
mysqli_close( $conn );
?>
這裡使用了mysql
的limit
實現一次只查詢一部分資料,前端傳來了引數offset
和limit
。
sql語句:
"SELECT * FROM posts where type='$type' order by id desc LIMIT $limit OFFSET $offset"
3.分析
這裡的 LIMIT $limit OFFSET $offset
的意思就是從 $offest
的值開始,查詢 $limit
條資料。
例如 $limit = 8,$offest = 0:表示查詢資料庫的前8條資料,從0開始(不包含0,mysql索引從0開始),查詢8條,也就是1~8條資料。
當我點選第二頁時:觸發handleCurrentChange()
函式:
此時引數val=2
,則offest = 8
,limit = 8
。
就會查詢第9~17條資料,如果沒有17條資料,也會返回查詢到9條後的所有資料。例如目前我資料庫就10條資料,那麼返回第9條和第10條兩條資料。
同時select.php中頁返回了總資料條數total:
SELECT COUNT(*) cnt FROM posts where type='$type'
前端頁面獲取到total
值後賦值給this.total
(綁定了Pagination的total
屬性,也就是總資料條數)。Pagination
根據:page-size="8"
屬性就會將資料自動分頁。例如後端返回的total為10,則分成兩頁。
4.結果
頁面載入完成:因為我是根據id逆序查詢http://www.cppcns.com,所以獲取了第3~10條(共8條)資料。
點選第二頁或者翻頁按鈕:獲取第1、2條資料。
注意:你的limit
引數一定要和Pagination
的page-size
屬性一致,也就時一次查詢一頁資料。而offset
就是當前的頁數。
到此這篇關於Vue+ElementUI 實現分頁查詢-mysql資料的文章就介紹到這了,更多相關Vue+ElementUI 實現分頁查詢內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!