vue angular 分别实现分页
1 vue实现分页组件
paginate组件
<template>
<div class="pagination-wrap" v-cloak v-if="totalPage!=0">
<ul class="pagination">
<li :class="currentPage==1?'disabled':''"><a href="javascript:;" @click="turnToPage(1,pageInfo.pagesize)">首页</a></li>
<li :class="currentPage==1?'disabled':''"><a @click="turnToPage(currentPage-1,pageInfo.pagesize)" href="javascript:;">上一页</a></li>
<li><a href="javascript:;" @click="turnToPage(currentPage-2,pageInfo.pagesize)" v-text="currentPage-2" v-if="currentPage-2>0"></a></li>
<li><a href="javascript:;" @click="turnToPage(currentPage-1,pageInfo.pagesize)" v-text="currentPage-1" v-if="currentPage-1>0"></a></li>
<li class="active"><a href="javascript:;" @click="turnToPage(currentPage,pageInfo.pagesize)" v-text="currentPage">3</a></li>
<li><a href="javascript:;" @click="turnToPage(currentPage+1,pageInfo.pagesize)" v-text="currentPage+1" v-if="currentPage+1<=totalPage"></a></li>
<li><a href="javascript:;" @click="turnToPage(currentPage+2,pageInfo.pagesize)" v-text="currentPage+2" v-if="currentPage+2<=totalPage"></a></li>
<li :class="currentPage==totalPage?'disabled':''"><a href="javascript:;" @click="turnToPage(currentPage+1,pageInfo.pagesize)" >下一页</a></li>
<li :class="currentPage==totalPage?'disabled':''"><a href="javascript:;" @click="turnToPage(totalPage,pageInfo.pagesize)">尾页</a></li>
<li class="curPagesize">
<select v-model="pageInfo.pagesize">
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</li>
</ul>
<small class="small nowrap"> 当前第 <span class="text-primary" v-text="currentPage"></span> 页,共有 <span class="text-primary" v-text="totalPage"></span> 页</small>
<div class="go">
<div :class="isPageNumberError?'input-group error':'input-group'">
<input class="form-control" type="number" min="1" max="totalPage" v-model="goToPage"><a href="javascript:;" class="input-group-addon" @click="turnToPage(goToPage,pageInfo.pagesize)">Go</a>
</div>
</div>
</div>
</template> <script type="text/javascript">
export default {
props: {
//传入总条数,默认0,可以对传入的值进行自定义的验证,具体方式如下
total: {
type: Number,
default: 0,
validator(value) {
return value >= 0
}
},
//传入每页的条数,默认为10
currentPagesize:{
type: Number,
default: 10,
validator(value) {
return value >= 0
}
},
//传入当前页码,默认为1
fatherCurrentPage:{
type: Number,
default: 1,
validator(value) {
return value >= 0
}
}
},
data(){
return {
isPageNumberError: false,
goToPage:'',
totalPage:'',
childCurrentPage:this.fatherCurrentPage,
pageInfo:{
pagesize:this.currentPagesize,
pageNum:this.fatherCurrentPage
}
}
},
computed:{
// prop不应该在组件内部做改变
// 所以我们这里设置一个内部计算属性currentPage来代替props中的myCurrentPage
currentPage(){
return this.childCurrentPage;
},
pagesizeCp(){
return this.pageInfo.pagesize
}
},
created:function(){
this.totalPage = Math.ceil(this.total/this.pageInfo.pagesize);
},
watch:{
pagesizeCp:function(curVal,oldVal){
console.log("new:"+curVal+",old:"+oldVal);
this.childCurrentPage = Math.ceil(this.childCurrentPage*oldVal/curVal);
this.totalPage = Math.ceil(this.total/curVal);
if(this.childCurrentPage > this.totalPage){
this.childCurrentPage = this.totalPage;
}
this.turnToPage(this.pageInfo.pageNum,this.pageInfo.pagesize);
} },
methods:{
//turnToPage为跳转到某页
//传入参数pageNum为要跳转的页数,pagesize为每页多少条信息
turnToPage( pageNum ,pagesize){
var _self = this;
var pageNum = parseInt(pageNum);
var pagesize = parseInt(pagesize);
//页数不合法则退出
if (!pageNum || pageNum > _self.totalPage || pageNum < 1) {
// console.log('页码输入有误!');
_self.isPageNumberError = true;
return false;
}else{
_self.isPageNumberError = false;
}
//更新当前页
_self.childCurrentPage = pageNum;
//数据变化时将页码信息传回给父组件
this.pageInfo.pageNum = pageNum;
this.pageInfo.pagesize =pagesize;
// 将最终获取到的页码信息传递个父组件的getInfo函数
this.$emit('getInfo',this.pageInfo);
}
}
}
</script> <style type="text/css">
.pagination-wrap{
margin: 0 auto;
}
.pagination {
display: inline-block;
padding-left: 0;
border-radius: 4px;
}
.small {
margin: 0 10px;
position: relative;
}
.nowrap {
white-space: nowrap;
}
.input-group {
position: relative;
display: table;
border-collapse: separate;
}
.input-group-addon {
padding: 6px 12px;
font-size: 14px;
font-weight: 400;
line-height: 1;
color: #555;
text-align: center;
background-color: #eee;
border: 1px solid #ccc;
border-radius: 0 4px 4px 0;
} .input-group-addon, .input-group-btn {
width: 1%;
white-space: nowrap;
vertical-align: middle;
}
.input-group-addon, .input-group-btn, .input-group .form-control {
box-sizing: border-box;
display: table-cell;
}
.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child>.btn-group:not(:last-child)>.btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group-addon, .input-group-btn, .input-group .form-control {
display: table-cell;
}
.input-group .form-control {
position: relative;
z-index: 2;
float: left;
width: 100%;
margin-bottom: 0;
}
.go .error .form-control{
border: 1px solid #d95656;
}
.form-control {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
-webkit-transition: border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}
.text-primary {
color: #428bca;
}
.pagination>li:first-child>a, .pagination>li:first-child>span {
margin-left: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.go {
display: inline-block;
max-width: 120px;
top: 16px;
position: relative;
}
.input-group-addon:last-child {
display: table-cell;
text-decoration: none;
border-left: 0;
}
.pagination>.disabled>span, .pagination>.disabled>span:hover, .pagination>.disabled>span:focus, .pagination>.disabled>a, .pagination>.disabled>a:hover, .pagination>.disabled>a:focus {
color: #777;
cursor: not-allowed;
background-color: #fff;
border-color: #ddd;
}
.pagination>li:last-child>a, .pagination>li:last-child>span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination>.active>a, .pagination>.active>span, .pagination>.active>a:hover, .pagination>.active>span:hover, .pagination>.active>a:focus, .pagination>.active>span:focus {
z-index: 2;
color: #fff;
cursor: default;
background-color: #428bca;
border-color: #428bca;
}
.pagination>li>a, .pagination>li>span{
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.42857143;
color: #428bca;
text-decoration: none;
background-color: #fff;
border: 1px solid #ddd;
}
.curPagesize{
width:42px;
color:blue;
margin-left:5px;
}
.pagination>li>select{
width:50px;
height:33px !important;
line-height:31px;
padding:0 5px;
margin-bottom:6px;
border-color: #ddd;
border-radius:5px; }
.pagination>li {
display: inline;
}
</style>
在父组件中进行引用
<template>
<div id = "outletapp">
<div class="data-body">
<paginate :total='parentTotal' :currentPagesize="parentPagesize" :fatherCurrentPage="parentCurrentPage" @getInfo="getPageInfo"></paginate>
</div>
</div>
</template>
<script>
//引入需要的组件
import paginate from '../components/paginate.vue'
var vm = {
name:'**',
data:function(){
return {
parentTotal:0,
parentCurrentPage:1,
parentPagesize:10,
queryParams:{
otherParams:'',
pagesize:10,
pageNum:1
}
}
},
watch:{
queryParams:{
handler:function(newVal,oldVal){
this.parentCallback(newVal);
},
deep:true
}
},
methods:{
querySearch:function(){
console.log('search');
},
// 更新pageNum和pagesize重新渲染页面
parentCallback:function(objParams){
// 此处为获取的参数信息,包括查询信息和页码信息,可以根据这些参数信息进行请求数据
console.log(objParams);
// this.$http.post('url地址',objParams,{emulateJSON:true}).then(function(res){
var res= jsontest2;
this.parentTotal = parseInt(res.total);
},function(res){
var tem = JSON.parse(res.bodyText);
alert(tem.desc);
})
},
getPageInfo:function(obj){
this.queryParams.pagesize = obj.pagesize;
this.queryParams.pageNum = obj.pageNum;
// parentCallback(this.queryParams);
}
},
beforeCreate:function(){
// 初始化请求一下数据
var res= jsontest2;
var tem = res;
this.itemList = tem.rows;
this.parentTotal = parseInt(tem.total);
},
created:function(){
var _self = this;
_self.parentCallback(_self.queryParams);
},
components:{
paginate
}
}
export default vm
</script>
<style>
</style>
angularjs实现分页指令
.directive('paginate', ['$http', function($http){
return {
scope: {
query: '&',
params: '=',
result: '=',
page: '=',
loading: '='
},
restrict: 'E',
template: [
'<div style="margin-bottom: 40px;margin-left: 20px; margin-top: 20px;" ng-cloak>',
'<button ng-click="go(1)" class="p-btn p-btn-active margin_r10">首页</button>',
'<button ng-click="pre()" title="上一页" class="p-btn p-btn-active margin_r10"><<</button>',
'<button class="p-btn margin_r10" title="{{code}}" ng-click="go(code)" ng-class="{\'p-btn-active\': code == params.pageNum}" ng-repeat="code in codes">{{code}}</button>',
'<button ng-click="next()" title="下一页" class="p-btn p-btn-active margin_r10">>></button>',
'<input type="number" ng-model="goPage" min=1 max="{{pageCount}}" style="height: 24px;width: 50px;text-align: center;" />',
'<button class="p-btn p-btn-active margin_r10" title="跳转至" ng-click="go()">Go</button>',
'<span>共 {{pageCount}} 页, </span>',
'<span>共 {{result.total}} 条记录</span>',
'</div>'
].join(''),
link: function($scope, iElm, iAttrs) {
$scope.codeNum = 5
$scope.codes = []
$scope.$watch('result', function() {
$scope.pageCount = getPageCount($scope.result.total, $scope.params.pageSize)
$scope.codes = getCodes($scope.pageCount, parseInt($scope.params.pageNum) ,$scope.codeNum)
})
// 计算总页数
function getPageCount(total, pageSize) {
var a = total%pageSize
if(a == 0) {
return parseInt(total/pageSize)
} else {
return parseInt(total/pageSize) + 1
}
}
// 计算页码显示
function getCodes(pageCount, index, codeNum){
if(pageCount <= codeNum) {
return getArray(1, pageCount)
} else {
if(index <= (codeNum + 1)/2) {
return getArray(1, codeNum)
}
if(index >= (pageCount- (codeNum - 1)/2)) {
return getArray(pageCount-codeNum+1, pageCount)
}
return getArray(index-(codeNum - 1)/2, index+(codeNum - 1)/2)
}
} function getArray(start, end) {
var arr = []
for (var i = start; i <= end; i++) {
arr.push(i)
}
return arr
} $scope.go = function(goPage) {
if(!goPage) {
if($scope.goPage)
goPage = $scope.goPage
}
if(goPage == $scope.params.pageNum) {
return
}
if(goPage == '0' || !goPage || goPage > $scope.pageCount || goPage < 0) {
return
} else {
$scope.page.index = goPage
}
$scope.query()
}
$scope.pre = function() {
if($scope.params.pageNum < 2) {
return
} else {
$scope.page.index = $scope.params.pageNum -1
}
$scope.query()
}
$scope.next = function() {
if($scope.pageCount == 0){
return
}
if($scope.params.pageNum == $scope.pageCount) {
return
} else {
$scope.page.index = $scope.params.pageNum + 1
}
$scope.query()
}
}
};
}])
引用时将对应的改指令文件引入,在html里面写入
<paginate params="queryParams" result="queryResult" query="query()" page="paginate"></paginate>
对应的样式设置
.p-btn {
border: none;
cursor: pointer;
color: #333;
padding: 6px 14px;
font-size: 12px;
display: inline;
background: #fff;
border: solid 1px #30363e;
height:30px;
}
.p-btn:hover {
background-color: rgba(63, 74, 89, 0.5);
}
.p-btn-active {
background-color: #3f4a59;
color: #fff;
}
vue angular 分别实现分页的更多相关文章
- Vue && Angular 双向绑定检测不到对象属性的添加和删除
由于ES5的限制 Vue && Angular 双向绑定检测不到对象属性的添加和删除 还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都s ...
- django rest_framework vue 实现用户列表分页
django rest_framework vue 实现用户列表分页 后端 配置urls # 导入view from api.appview.userListView import userListV ...
- 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决
关于vue+element-ui项目的分页,返回默认显示第一页的问题解决 问题描述 当前页面如下: 然后点击页码跳到第3页,然后在第三页点击页面链接跳转到新的页面 然后在新页面点击返回按钮,返 ...
- vue修改elementUI的分页组件视图没更新问题
转: vue修改elementUI的分页组件视图没更新问题 今天遇到一个小问题平时没留意,el-pagination这个分页组件有一个属性是current-page当前页.今天想在methods里面手 ...
- 基于Vue.js的表格分页组件
有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...
- Vue.js的表格分页组件
转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更 ...
- Jenkins gitlab vue,angular,react 自动化构建【原】
大致思路,(本篇主要讲vue ,当然了 angular react 也是一样配置) ,转发请注明原链接,谢谢 :) 1. 服务器上面配置jenkins (安装配置,不介绍) 2.新建item 自由风格 ...
- Angular.js实现分页
一.编写angularJS实现的分页js(网上搜)和样式表(pagination),并在页面引入 二.编写变量和方法 //分页控件控制 $scope.paginationConf={ currentP ...
- 在angular中利用分页插件进行分页
必需:angular分页js和css 当然还有angular.js 还需要bootstrap的css angular.min.js (下面我直接把插件粘贴上去了,以免有的同学还要去找.是不是很贴 ...
随机推荐
- iot-hub物管理bug
物管理中,物绑定证书,如果证书被删除,将会出错 初始化用到 证书编码,证书为null时,null.code报错
- (转)Fabric 1.0 读写集
本文译自Fabric 1.0 文档,这篇文档详述了当前读写集语义实现的细节.文档地址为: https://hyperledger-fabric.readthedocs.io/en/latest/rea ...
- 使用web3j工具生成java版本的智能合约
这里需要使用的环境 web3j,nodejs 安装编译sol工具 $ npm install -g solc 保存为hello.sol文件到本地 pragma solidity 0.4.19; con ...
- mysql timestamp
select from_unixtime(m.createdAt, '%Y-%m-%d %H:%i:%s') from kfrobotaidlog m; select m.customeruid, ...
- SIP协议流程
1.注册流程: 2.注销流程: 3. 基本呼叫建立过程: 4. 会话更改流程: 5. 正常呼叫释放过程: 6. 被叫忙呼叫释放: 7.被叫无应答流程一: 8.被叫无应答流程二: 9.遇忙呼叫前转:
- TortoiseGit推送代码到Gerrit的过程
gerrit的安装不在本博客的说明范围中,本博客阐述的是使用TortoiseGit 提交代码到gerrit上的步骤和配置. 一.Git 说明:这个工具只要用来做一个仿真的linux环境,可以执行大部分 ...
- Groovy动态解析
A:前面需要说些什么吗? B:不需要吗? A:需要吗? 解析方式一:通过指定的paths来初始化GroovyScriptEngine //通过指定的paths来初始化GroovyScriptEngin ...
- linux 标准输入输出 重定向
背景: 屏幕打印不一定都是从标准输出来的,也包括标准错误输出流stderr中的信息 文件描述符定义(系统定义了12个) 0 标准输入 1 标准输出 2 标准错误 0 默认键盘输入 1,2默认从屏幕 ...
- iOS UI基础-9.2 UITableView 简单微博列表
概述 我们要实现的效果: 这个界面布局也是UITableView实现的,其中的内容就是UITableViewCell,只是这个UITableViewCell是用户自定义实现的.虽然系统自带的UITab ...
- JavaScript 基础数组循环和迭代的几种方法
JavaScript 数组循环和迭代 (之前一直没怎么注意数组循环,今天做一道题时,用到forEach循环发现它并没有按照我想象的样子执行,总结一下数组循环) 一.第一种方法就是for()循环 ...