@zscreate/zhxy-app-component 1.0.319 → 1.0.320-test.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/form-container/form-container.vue +85 -13
- package/components/page-pagination/changelog.md +38 -0
- package/components/page-pagination/icon/iconfont.css +35 -0
- package/components/page-pagination/page-pagination.vue +733 -0
- package/components/page-pagination/readme.md +136 -0
- package/package.json +1 -1
|
@@ -9,11 +9,46 @@
|
|
|
9
9
|
<text>{{ item.name }}</text>
|
|
10
10
|
</view>
|
|
11
11
|
<view class="table-container">
|
|
12
|
+
<template v-if="item.options.supportPage">
|
|
13
|
+
<view class="table-item" v-for="(table, tableCIndex) in currTablePageData(item)"
|
|
14
|
+
:key="tablePageIndex(item.model,tableCIndex)"
|
|
15
|
+
:index="tablePageIndex(item.model,tableCIndex)"
|
|
16
|
+
>
|
|
17
|
+
<view class="item">
|
|
18
|
+
<view class="index">{{table.index + 1}}</view>
|
|
19
|
+
<view class="delete icon-delete" v-if="!item.options.disabled&&!item.options.hiddenOperateBtn"
|
|
20
|
+
@click="handleDeleteRow(tablePageIndex(item.model,tableCIndex), item.model)">删除</view>
|
|
21
|
+
<view class="extend"
|
|
22
|
+
:class="{'icon-arrow-right': !tableRowsShow[item.model][tablePageIndex(item.model,tableCIndex)], 'icon-arrow-down':tableRowsShow[item.model][tablePageIndex(item.model,tableCIndex)]}"
|
|
23
|
+
@click="showTableRow(item.model, tablePageIndex(item.model,tableCIndex))">
|
|
24
|
+
{{tableRowsShow[item.model][tablePageIndex(item.model,tableCIndex)] ? '收起' : '展开'}}
|
|
25
|
+
</view>
|
|
26
|
+
</view>
|
|
27
|
+
<view class="view-port" v-show="tableRowsShow[item.model][tablePageIndex(item.model,tableCIndex)]">
|
|
28
|
+
<view v-for="(tableItem, tableItemIndex) in table.columns" :key="tableItemIndex">
|
|
29
|
+
<evan-form-item v-show="tableItem.options.canView"
|
|
30
|
+
:labelPosition="labelPosition"
|
|
31
|
+
@upDateWidget="data => upDateTableWidget(data, tableItemIndex, item.model, tablePageIndex(item.model,tableCIndex))" :itemkey="tableItemIndex"
|
|
32
|
+
:curLoadedPages="(tablePageInfo[item.model].current - 1) * tablePageInfo[item.model].pageSize + tablePageInfo[item.model].pageSize"
|
|
33
|
+
:parentTableKey="item.key" :tableKey="item.model" :tableIndex="tablePageIndex(item.model,tableCIndex)" :prop="tableItem.model"
|
|
34
|
+
:ref="String(Math.random()).split('.')[1]" :models.sync="models"
|
|
35
|
+
:rules="rules" :widget.sync="tableItem" :isDraft="isDraft" :formId="formId"
|
|
36
|
+
:linkage="linkage" :isApply="isApply" :applyId="applyId">
|
|
37
|
+
</evan-form-item>
|
|
38
|
+
</view>
|
|
39
|
+
</view>
|
|
40
|
+
</view>
|
|
41
|
+
<page-pagination :total="tablePageInfo[item.model]&&tablePageInfo[item.model].total"
|
|
42
|
+
:currentPage="tablePageInfo[item.model]&&tablePageInfo[item.model].current"
|
|
43
|
+
@change="(...args) => tablePageChange(item,...args)"
|
|
44
|
+
:numAround="true" :showBorder="false"></page-pagination>
|
|
45
|
+
</template>
|
|
46
|
+
<template v-else>
|
|
12
47
|
<view class="table-item" v-for="(table, tableCIndex) in tableData[item.model]"
|
|
13
48
|
:key="tableCIndex">
|
|
14
49
|
<view class="item">
|
|
15
50
|
<view class="index">{{table.index + 1}}</view>
|
|
16
|
-
<view class="delete icon-delete" v-if="!item.options.disabled"
|
|
51
|
+
<view class="delete icon-delete" v-if="!item.options.disabled&&!item.options.hiddenOperateBtn"
|
|
17
52
|
@click="handleDeleteRow(tableCIndex, item.model)">删除</view>
|
|
18
53
|
<view class="extend"
|
|
19
54
|
:class="{'icon-arrow-right': !tableRowsShow[item.model][tableCIndex], 'icon-arrow-down':tableRowsShow[item.model][tableCIndex]}"
|
|
@@ -21,6 +56,7 @@
|
|
|
21
56
|
{{tableRowsShow[item.model][tableCIndex] ? '收起' : '展开'}}
|
|
22
57
|
</view>
|
|
23
58
|
</view>
|
|
59
|
+
{{tableRowsShow[item.model][tableCIndex]}}
|
|
24
60
|
<view class="view-port" v-show="tableRowsShow[item.model][tableCIndex]">
|
|
25
61
|
<view v-for="(tableItem, tableItemIndex) in table.columns" :key="tableItemIndex">
|
|
26
62
|
<evan-form-item v-show="tableItem.options.canView"
|
|
@@ -34,7 +70,8 @@
|
|
|
34
70
|
</view>
|
|
35
71
|
</view>
|
|
36
72
|
</view>
|
|
37
|
-
|
|
73
|
+
</template>
|
|
74
|
+
<view class="add" v-if="isShowAdd && !item.options.disabled&&!item.options.hiddenOperateBtn" :data-data="item"
|
|
38
75
|
:data-model="item.model" data-add-model="addModel"
|
|
39
76
|
@click="addToTableData(item, item.model,'addModel')">+添加</view>
|
|
40
77
|
</view>
|
|
@@ -227,6 +264,7 @@ import {
|
|
|
227
264
|
} from "../../utils/util.js";
|
|
228
265
|
import Pubsub from 'pubsub-js'
|
|
229
266
|
import evanFormItem from "../evan-form-item/evan-form-item";
|
|
267
|
+
import pagePagination from '../page-pagination/page-pagination';
|
|
230
268
|
import evanForm from "../evan-form/evan-form";
|
|
231
269
|
import mTextarea from "../m-textarea/m-textarea";
|
|
232
270
|
import packageJson from '../../package.json'
|
|
@@ -248,7 +286,7 @@ export default {
|
|
|
248
286
|
props: ['dataObj', 'value', 'isButton', 'verifyNode', 'verifyLogs', 'suggest', 'isCorrect', 'isDraft', 'formId', 'linkage', "labelPosition",
|
|
249
287
|
'isApply','applyId'
|
|
250
288
|
],
|
|
251
|
-
components: { evanFormItem ,evanForm, mTextarea },
|
|
289
|
+
components: { evanFormItem ,evanForm, mTextarea, pagePagination, },
|
|
252
290
|
provide() {
|
|
253
291
|
return {
|
|
254
292
|
formContext: this,
|
|
@@ -317,6 +355,7 @@ export default {
|
|
|
317
355
|
formDesignFlag: false,
|
|
318
356
|
unwatch:null,
|
|
319
357
|
publish_linkage_array:[],
|
|
358
|
+
tablePageInfo: {}
|
|
320
359
|
}
|
|
321
360
|
},
|
|
322
361
|
watch: {
|
|
@@ -412,7 +451,6 @@ export default {
|
|
|
412
451
|
this.generateModle(this.data.list);
|
|
413
452
|
this.initFormLinkage();
|
|
414
453
|
this.updateFormDataToModels()
|
|
415
|
-
console.log(JSON.stringify(this.models))
|
|
416
454
|
}
|
|
417
455
|
},
|
|
418
456
|
immediate: true
|
|
@@ -445,6 +483,23 @@ export default {
|
|
|
445
483
|
this.fillVerifySignSeal(item)
|
|
446
484
|
}
|
|
447
485
|
},
|
|
486
|
+
tableData: {
|
|
487
|
+
handler(val) {
|
|
488
|
+
const keys = Object.keys(this.tableData)
|
|
489
|
+
keys.forEach(key => {
|
|
490
|
+
if (!this.tablePageInfo[key]) {
|
|
491
|
+
this.$set(this.tablePageInfo, key, {
|
|
492
|
+
current: 1,
|
|
493
|
+
pageSize: 10,
|
|
494
|
+
total: this.tableData[key].length
|
|
495
|
+
})
|
|
496
|
+
}
|
|
497
|
+
this.tablePageInfo[key].total = this.tableData[key].length
|
|
498
|
+
})
|
|
499
|
+
},
|
|
500
|
+
immediate: true,
|
|
501
|
+
deep: true
|
|
502
|
+
},
|
|
448
503
|
// linkage:{
|
|
449
504
|
// deep: true,
|
|
450
505
|
// handler(v){
|
|
@@ -521,6 +576,25 @@ export default {
|
|
|
521
576
|
// this.initPo();
|
|
522
577
|
},
|
|
523
578
|
methods: {
|
|
579
|
+
tablePageIndex(model,index){
|
|
580
|
+
return (this.tablePageInfo[model].current - 1) * this.tablePageInfo[model].pageSize + index
|
|
581
|
+
},
|
|
582
|
+
currTablePageData(item) {
|
|
583
|
+
// TODO 处理首次加载页面很多select需要请求远程字典问题(分页,只请求前十条)
|
|
584
|
+
const startPage = (this.tablePageInfo[item.model]?.current - 1)* this.tablePageInfo[item.model]?.pageSize
|
|
585
|
+
const endPage = (this.tablePageInfo[item.model]?.current - 1) * this.tablePageInfo[item.model]?.pageSize + this.tablePageInfo[item.model]?.pageSize
|
|
586
|
+
let pageData = this.tableData[item.model]?.slice(startPage, endPage)
|
|
587
|
+
return pageData
|
|
588
|
+
},
|
|
589
|
+
async tablePageChange(item, page) {
|
|
590
|
+
let pageSize=10;
|
|
591
|
+
await this.$nextTick()
|
|
592
|
+
if (this.tablePageInfo[item.model].pageSize !== pageSize) page = 1
|
|
593
|
+
this.tablePageInfo[item.model].pageSize = pageSize
|
|
594
|
+
await this.$nextTick()
|
|
595
|
+
this.tablePageInfo[item.model].current = page
|
|
596
|
+
await this.$nextTick()
|
|
597
|
+
},
|
|
524
598
|
// 表单联动部分组件并未放入evanFormItem,所以并未订阅相关事件,此方法将相关组件放入订阅模式
|
|
525
599
|
initFormLinkage() {
|
|
526
600
|
if(this.data?.list){
|
|
@@ -761,18 +835,17 @@ export default {
|
|
|
761
835
|
// }).exec()
|
|
762
836
|
// this.$set(this.tableFlag,'flag',[true])
|
|
763
837
|
// this.tableFlag.flag = [true];
|
|
764
|
-
|
|
765
|
-
this.tableRowsShow[model]
|
|
838
|
+
// this.tableRowsShow[model][index] = !this.tableRowsShow[model][index];
|
|
839
|
+
this.$set(this.tableRowsShow[model], index, !this.tableRowsShow[model][index]);
|
|
766
840
|
/***解决小程序不能深度监听***/
|
|
767
841
|
var tempObj = cloneObj(this.tableRowsShow)
|
|
768
|
-
console.log(this.tableRowsShow
|
|
769
|
-
console.log(this.tableRowsShow)
|
|
770
|
-
// console.log(this.tableRowsShow[model][index])
|
|
842
|
+
// console.log(this.tableRowsShow[model][index],index)
|
|
771
843
|
|
|
772
844
|
// console.log(this.tableRowsShow[model][index])
|
|
773
845
|
},
|
|
774
846
|
//删除子表单row
|
|
775
847
|
handleDeleteRow(index, model) {
|
|
848
|
+
console.log('删除子表单row',index, model)
|
|
776
849
|
// //更新tableData
|
|
777
850
|
//更新models
|
|
778
851
|
this.models[model].splice(index, 1);
|
|
@@ -819,9 +892,7 @@ export default {
|
|
|
819
892
|
} else {
|
|
820
893
|
dataTemp.options.isCorrect = true;
|
|
821
894
|
}
|
|
822
|
-
console.log(`dataTemp`, dataTemp);
|
|
823
895
|
this.tableData[model].push(dataTemp);
|
|
824
|
-
console.log('===', this.tableData[model])
|
|
825
896
|
// console.log(this.tableData[model])
|
|
826
897
|
},
|
|
827
898
|
//tableData init
|
|
@@ -849,9 +920,10 @@ export default {
|
|
|
849
920
|
this.models[model] instanceof Array &&
|
|
850
921
|
this.models[model].length > 0
|
|
851
922
|
) {
|
|
852
|
-
|
|
853
|
-
this.models[model].forEach((item, index) => {
|
|
923
|
+
console.log('--',this.tableModel[model], model)
|
|
924
|
+
this.models[model].forEach(async(item, index) => {
|
|
854
925
|
this.originIndex++;
|
|
926
|
+
await timeout(0)
|
|
855
927
|
this.addToTableData(this.tableModel[model], model);
|
|
856
928
|
});
|
|
857
929
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
## 1.2.1(2024-03-13)
|
|
2
|
+
优化代码
|
|
3
|
+
## 1.2.0(2023-06-21)
|
|
4
|
+
1. 更改样式使用scss,未安装的请自行安装;
|
|
5
|
+
2. 样式单位rpx更改为px;
|
|
6
|
+
3. 新增 不显示页码边框 属性;
|
|
7
|
+
4. 新增属性layout,自定义分页排版;
|
|
8
|
+
5. 新增每页条数预设值属性(pageSizes),可选择每页条数,同时新增每页条数切换时触发的事件;
|
|
9
|
+
6. 移除showAround、showPageInfo和showGoPage属性,功能合并到layout中;
|
|
10
|
+
## 1.1.2(2022-11-09)
|
|
11
|
+
解决nvue页面样式错乱问题
|
|
12
|
+
## 1.1.0(2021-09-07)
|
|
13
|
+
1. 解决 currentPage设置初始值时,页码不准确;
|
|
14
|
+
2. 解决打开非第一页后再重新查询 ,当前页和跳转页都变成0;
|
|
15
|
+
## 1.0.9(2021-08-26)
|
|
16
|
+
1. 解决支付宝小程序在真机中,上页下页图标不显问题;
|
|
17
|
+
2. 优化支付宝小程序中自定义分页显示;
|
|
18
|
+
3. 优化图标,只取需要的图标,减小icon图标文件;
|
|
19
|
+
## 1.0.8(2021-07-29)
|
|
20
|
+
解决总页数为1时,仍可以点击下页或尾页的问题
|
|
21
|
+
## 1.0.6(2021-06-25)
|
|
22
|
+
1. 解决在 nvue 页面下显示不正常问题;
|
|
23
|
+
2. 去掉 css 部分使用的scss,方便在没有安装scss编译插件下也能够运行项目;
|
|
24
|
+
## 1.0.5(2021-05-25)
|
|
25
|
+
解决页数从0开始的问题;
|
|
26
|
+
## 1.0.4(2021-05-10)
|
|
27
|
+
1. 新增 设置显示页码的个数;
|
|
28
|
+
2. 新增 是否显示分页信息(总条数、每页条数等);
|
|
29
|
+
3. 新增 页码input输入框,方便跳转页面;
|
|
30
|
+
## 1.0.3(2021-05-09)
|
|
31
|
+
修改部分样式
|
|
32
|
+
## 1.0.2(2021-05-09)
|
|
33
|
+
1. 新增 可设置页码按钮大小 ,设置属性 size;
|
|
34
|
+
2. 新增 可自定义页码颜色,设置属性 color;
|
|
35
|
+
## 1.0.1(2021-04-27)
|
|
36
|
+
修改事件的返回值,去掉上页下页等事件,合并为一个 change 事件,详细信息见下面事件说明。
|
|
37
|
+
## 1.0.0(2021-04-22)
|
|
38
|
+
第一次提交
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: "icon";
|
|
3
|
+
/* Project id 2498003 */
|
|
4
|
+
src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAN0AAsAAAAACIwAAAMlAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDQAqEAIMbATYCJAMYCw4ABCAFhGcHThtVB8iemjxpZAwBC7GBVYDAaYggGvvf7Nl3a6pJDIsmiUz6kChFLAUankgFqpfw/ldn6oBYhwiGL8UJyzos2a9b0gloBx62o6mAuHXr2HdEw7tPMwtANtEZzawY/uHexS1L9FEfgJpz4ccsD6hAxpoWybix7OiA/BbZnUFe1DUCvXY1cb/WNTCBgi8EbkXxPFnVQRofFwoVkK8oUVriQ7fQoFOLeIcq6bn7Q7wNXz7+m/iS1Mza6fbjThnt//bZK1k70DzKH93pinD3hIqMzY3J4lm75imP2LPJQ2+dy9MVSHd1S9KkuT178Lut00EwtpVxNF6vrSFN8o9XVKKxYvvBdeyt/PJxERK//BAyv2oQgl+tCIVfbQUqaBN26cELvEeJm5pkISSpB337SFh4eFTkvHNb23Ht6btBkZLSG16KM0e+quXCtUJonkqu63uuDEur+O3OXT1//YwWOTF55vzVi9HkrB5Dz7kEqaXptBY1OXH6/IVrl64IogS9soJzhVKY5+TTtL8dNnp/NAy9MzGUVglVadpWelW613haFVSmIagJKf07GTsH1o9bziZ/vE5P+pTzESd/yg4KUuXoUden3H4/dP/lLTPGH9IiZVptkS49zLorf3d7Tsej8mlIQj53f4y59BdB8IN/OrEc0vCvuwv4OfDhFLJ0PA3zdkuAKb+VC4hadCut1JV3dxBo1niAxO8r+pOGUZ+n4o2BXYTuHFWApMscZN3mMYWwDlWffWi6nUKvDZ2z+4yx8xClB8uOIwjDrkEy6Btkw+5gCuENVJP+QDPsP/R6GEHL9VmO1M5A4CBjcRMrks1KHD4P6x0DumoWWJVzCpiqYDsuLSop+rvBCmyMEeoaLeOcYMJsFtzFdwOz2YbtzGYEiRcZOLfXFReTupsUSTYLascAAQdkmGgTppDYWBEfneff3hhArTITMCBmSsWolEzqx0oVKQFgujlWUNmNrKJaQ5XhOAIjGPJZYF2iCpg1jw1mr+9kBCRcEcMAl12dYhuNQDlFy/Msr7gGelnHtUiRo0SNFl3KExsDTzMQ7sUUavDJiaTUm6tLEQIAAAA=') format('woff2'),
|
|
5
|
+
url('//at.alicdn.com/t/font_2498003_mr6aek1y1y8.woff?t=1629946644041') format('woff'),
|
|
6
|
+
url('//at.alicdn.com/t/font_2498003_mr6aek1y1y8.ttf?t=1629946644041') format('truetype');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.icon {
|
|
10
|
+
font-family: "icon" !important;
|
|
11
|
+
font-size: 16px;
|
|
12
|
+
font-style: normal;
|
|
13
|
+
-webkit-font-smoothing: antialiased;
|
|
14
|
+
-moz-osx-font-smoothing: grayscale;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.icon-more:before {
|
|
18
|
+
content: "\e638";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.icon-left:before {
|
|
22
|
+
content: "\e607";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.icon-right:before {
|
|
26
|
+
content: "\e609";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.icon-left1:before {
|
|
30
|
+
content: "\e641";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.icon-right1:before {
|
|
34
|
+
content: "\e642";
|
|
35
|
+
}
|
|
@@ -0,0 +1,733 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<view class="contact page-pagination" :class="size=='large'?'size-large':size=='small'?'size-small':''">
|
|
3
|
+
<view class="page-con" :class="!showBorder&&'no-border'">
|
|
4
|
+
<view class="page-scroll">
|
|
5
|
+
<!-- #ifdef APP-NVUE -->
|
|
6
|
+
<scroll-view scroll-x="true">
|
|
7
|
+
<!-- #endif -->
|
|
8
|
+
<view class="page-scroll-child">
|
|
9
|
+
<view v-for="(item, index) in setLayout" :key="index">
|
|
10
|
+
<template v-if="item == 'total'">
|
|
11
|
+
<!-- 总条数 -->
|
|
12
|
+
<text class="page-total pc-page">共 {{total}} 条</text>
|
|
13
|
+
</template>
|
|
14
|
+
<template v-if="item == 'first'">
|
|
15
|
+
<!-- 首页 -->
|
|
16
|
+
<view class="pag-btn start" v-if="!numAround" :style="{color}"
|
|
17
|
+
:class="[nowPage==1&&'btn-ban',btnText&&'btn-text']" @click="clickStart">
|
|
18
|
+
<!-- #ifdef APP-NVUE -->
|
|
19
|
+
<text>首页</text>
|
|
20
|
+
<!-- #endif -->
|
|
21
|
+
<!-- #ifndef APP-NVUE -->
|
|
22
|
+
<text v-if="btnText">首页</text>
|
|
23
|
+
<text v-else class="icon icon-left1"></text>
|
|
24
|
+
<!-- #endif -->
|
|
25
|
+
</view>
|
|
26
|
+
</template>
|
|
27
|
+
<template v-if="item == 'prev'">
|
|
28
|
+
<!-- 上页 -->
|
|
29
|
+
<view class="pag-btn prev" :style="{color}" :class="[nowPage==1&&'btn-ban',btnText&&'btn-text']"
|
|
30
|
+
@click="clickPrev">
|
|
31
|
+
<!-- #ifdef APP-NVUE -->
|
|
32
|
+
<text>上页</text>
|
|
33
|
+
<!-- #endif -->
|
|
34
|
+
<!-- #ifndef APP-NVUE -->
|
|
35
|
+
<text v-if="btnText">上页</text>
|
|
36
|
+
<text v-else class="icon icon-left"></text>
|
|
37
|
+
<!-- #endif -->
|
|
38
|
+
</view>
|
|
39
|
+
</template>
|
|
40
|
+
<template v-if="item == 'page'">
|
|
41
|
+
<!-- 简单模式 -->
|
|
42
|
+
<view v-if="mode=='simple'" class="page-num simple">
|
|
43
|
+
<text :style="{color}" style="margin-right: 5px;">{{nowPage}}</text>/ {{pageNum}}
|
|
44
|
+
</view>
|
|
45
|
+
<!-- 复杂模式 -->
|
|
46
|
+
<view class="page-num" v-else>
|
|
47
|
+
<template v-if="pageNum <= showPageSize">
|
|
48
|
+
<view v-for="page in pageNumArr" :key="page" class="pag-btn" :class="page==nowPage&&'active'"
|
|
49
|
+
:style="{color, backgroundColor:(page==nowPage?color:''), borderColor:(page==nowPage?color:'')}"
|
|
50
|
+
@click="clickPage(page)">{{page}}</view>
|
|
51
|
+
</template>
|
|
52
|
+
<template v-else>
|
|
53
|
+
<!-- 第一页页码 -->
|
|
54
|
+
<view class="pag-btn" :class="nowPage==1&&'active'"
|
|
55
|
+
:style="{color, backgroundColor:(nowPage==1?color:''), borderColor:(nowPage==1?color:'')}"
|
|
56
|
+
v-if="numAround" @click="clickPage(1)">1</view>
|
|
57
|
+
<!-- 左侧省略号 -->
|
|
58
|
+
<view class="pag-btn ellipsis-btn"
|
|
59
|
+
v-if="(forceEllipses && getFirstPage != 1) || (numAround && getFirstPage != 2)">
|
|
60
|
+
<text class="icon icon-more"></text>
|
|
61
|
+
</view>
|
|
62
|
+
<template v-for="(p, i) in showPageSize">
|
|
63
|
+
<template v-if="i<showPageSize-2">
|
|
64
|
+
<!-- 中间页码 -->
|
|
65
|
+
<view :key="i" class="pag-btn" :class="(getFirstPage+i)==nowPage&&'active'"
|
|
66
|
+
:style="{color, backgroundColor:((getFirstPage+i)==nowPage?color:''),borderColor:((getFirstPage+i)==nowPage?color:'')}"
|
|
67
|
+
@click="clickPage(getFirstPage+i)">
|
|
68
|
+
{{getFirstPage+i}}
|
|
69
|
+
</view>
|
|
70
|
+
</template>
|
|
71
|
+
<template v-else>
|
|
72
|
+
<!-- 若显示省略号,则页码只显示 showPageSize-2 页 -->
|
|
73
|
+
<view :key="i" v-if="!forceEllipses && !numAround" class="pag-btn"
|
|
74
|
+
:class="(getFirstPage+i)==nowPage&&'active'"
|
|
75
|
+
:style="{color, backgroundColor:((getFirstPage+i)==nowPage?color:''), borderColor:((getFirstPage+i)==nowPage?color:'')}"
|
|
76
|
+
@click="clickPage(getFirstPage+i)">
|
|
77
|
+
{{getFirstPage+i}}
|
|
78
|
+
</view>
|
|
79
|
+
</template>
|
|
80
|
+
</template>
|
|
81
|
+
<!-- 右侧省略号 -->
|
|
82
|
+
<view class="pag-btn ellipsis-btn"
|
|
83
|
+
v-if="(forceEllipses && getFirstPage<pageNum-(showPageSize-3)) || (numAround && getFirstPage < pageNum-(showPageSize-2))">
|
|
84
|
+
<text class="icon icon-more"></text>
|
|
85
|
+
</view>
|
|
86
|
+
<!-- 最后一页页码 -->
|
|
87
|
+
<view class="pag-btn last-page" :class="nowPage==pageNum&&'active'"
|
|
88
|
+
:style="{color,backgroundColor:(nowPage==pageNum?color:''),borderColor:(nowPage==pageNum?color:'')}"
|
|
89
|
+
v-if="numAround && getFirstPage < pageNum-(showPageSize-3)" @click="clickPage(pageNum)">{{pageNum}}</view>
|
|
90
|
+
</template>
|
|
91
|
+
</view>
|
|
92
|
+
</template>
|
|
93
|
+
<template v-if="item == 'next'">
|
|
94
|
+
<!-- 下页 -->
|
|
95
|
+
<view class="pag-btn next" :style="{color}" :class="[pageNum<=nowPage&&'btn-ban',btnText&&'btn-text']"
|
|
96
|
+
@click="clickNext">
|
|
97
|
+
<!-- #ifdef APP-NVUE -->
|
|
98
|
+
<text>下页</text>
|
|
99
|
+
<!-- #endif -->
|
|
100
|
+
<!-- #ifndef APP-NVUE -->
|
|
101
|
+
<text v-if="btnText">下页</text>
|
|
102
|
+
<text v-else class="icon icon-right"></text>
|
|
103
|
+
<!-- #endif -->
|
|
104
|
+
</view>
|
|
105
|
+
</template>
|
|
106
|
+
<template v-if="item == 'last'">
|
|
107
|
+
<!-- 尾页 -->
|
|
108
|
+
<view class="pag-btn end" v-if="!numAround" :style="{color}"
|
|
109
|
+
:class="[pageNum<=nowPage&&'btn-ban',btnText&&'btn-text']" @click="clickEnd">
|
|
110
|
+
<!-- #ifdef APP-NVUE -->
|
|
111
|
+
<text>尾页</text>
|
|
112
|
+
<!-- #endif -->
|
|
113
|
+
<!-- #ifndef APP-NVUE -->
|
|
114
|
+
<text v-if="btnText">尾页</text>
|
|
115
|
+
<text v-else class="icon icon-right1"></text>
|
|
116
|
+
<!-- #endif -->
|
|
117
|
+
</view>
|
|
118
|
+
</template>
|
|
119
|
+
<template v-if="item == 'limit'">
|
|
120
|
+
<!-- 选择每页条数 -->
|
|
121
|
+
<view class="page-limit pc-page">
|
|
122
|
+
<picker v-model="pageSizeIndex" :range="newPageSizes" @change="changePageSize">
|
|
123
|
+
<text class="page-input">{{newPageSizes[pageSizeIndex]}}</text>
|
|
124
|
+
<text class="icon icon-left"></text>
|
|
125
|
+
</picker>
|
|
126
|
+
</view>
|
|
127
|
+
</template>
|
|
128
|
+
<template v-if="item == 'jumper'">
|
|
129
|
+
<!-- 前往页数 -->
|
|
130
|
+
<view class="page-go pc-page">前往第
|
|
131
|
+
<template v-if="trigger=='blur'">
|
|
132
|
+
<input class="page-input" v-model="inputPage" @blur="goPage" @input="onInput" />页
|
|
133
|
+
</template>
|
|
134
|
+
<template v-else>
|
|
135
|
+
<input class="page-input" v-model="inputPage" @input="onInput" />页
|
|
136
|
+
<text class="page-input-btn" @click="goPage">跳转</text>
|
|
137
|
+
</template>
|
|
138
|
+
</view>
|
|
139
|
+
</template>
|
|
140
|
+
</view>
|
|
141
|
+
<!-- #ifndef MP-WEIXIN -->
|
|
142
|
+
<view class="custom-info pc-page">
|
|
143
|
+
<slot />
|
|
144
|
+
</view>
|
|
145
|
+
<!-- #endif -->
|
|
146
|
+
</view>
|
|
147
|
+
<!-- #ifdef APP-NVUE -->
|
|
148
|
+
</scroll-view>
|
|
149
|
+
<!-- #endif -->
|
|
150
|
+
</view>
|
|
151
|
+
</view>
|
|
152
|
+
<view class="mobile-page">
|
|
153
|
+
<view class="custom-info">
|
|
154
|
+
<slot />
|
|
155
|
+
</view>
|
|
156
|
+
<view v-for="(item, index) in mLayout" :key="index">
|
|
157
|
+
<template v-if="item == 'total'">
|
|
158
|
+
<!-- 总条数 -->
|
|
159
|
+
<view class="page-total">共 {{total}} 条</view>
|
|
160
|
+
</template>
|
|
161
|
+
<template v-if="item == 'limit'">
|
|
162
|
+
<!-- 选择每页条数 -->
|
|
163
|
+
<view class="page-limit">
|
|
164
|
+
<picker v-model="pageSizeIndex" :range="newPageSizes" @change="changePageSize">
|
|
165
|
+
<text class="page-input">{{newPageSizes[pageSizeIndex]}}</text>
|
|
166
|
+
<text class="icon icon-left"></text>
|
|
167
|
+
</picker>
|
|
168
|
+
</view>
|
|
169
|
+
</template>
|
|
170
|
+
<template v-if="item == 'jumper'">
|
|
171
|
+
<!-- 前往页数 -->
|
|
172
|
+
<view class="page-go">前往第
|
|
173
|
+
<template v-if="trigger=='blur'">
|
|
174
|
+
<input class="page-input" v-model="inputPage" @blur="goPage" @input="onInput" />页
|
|
175
|
+
</template>
|
|
176
|
+
<template v-else>
|
|
177
|
+
<input class="page-input" v-model="inputPage" @input="onInput" />页
|
|
178
|
+
<text class="page-input-btn" @click="goPage">跳转</text>
|
|
179
|
+
</template>
|
|
180
|
+
</view>
|
|
181
|
+
</template>
|
|
182
|
+
</view>
|
|
183
|
+
</view>
|
|
184
|
+
</view>
|
|
185
|
+
</template>
|
|
186
|
+
<script>
|
|
187
|
+
/**
|
|
188
|
+
* @property {Number} total 数据总条数,默认0
|
|
189
|
+
* @property {Number} pageSize 每页显示条数,默认10
|
|
190
|
+
* @property {Number} currentPage 当前页,默认1
|
|
191
|
+
* @property {String} mode = [multi|simple] 显示模式,默认multi
|
|
192
|
+
* @value multi 标准模式(默认)
|
|
193
|
+
* @value simple 简单模式,只显示当前页/总页数
|
|
194
|
+
* @property {Boolean} btnText = [true|false] 上页、下页、首页和尾页按钮是否显示汉字,默认false使用箭头表示
|
|
195
|
+
* @property {Boolean} numAround = [true|false] 是否用页码中的第一页和最后一页表示首尾页,将不在显示首尾页,默认false
|
|
196
|
+
* @property {Boolean} forceEllipses = [true|false] 是否显示省略号,默认false
|
|
197
|
+
* @property {Number} showPageSize 中间页码显示的个数,默认5
|
|
198
|
+
* @property {String} size = [large|normal|small] 按钮大小,默认normal
|
|
199
|
+
* @value large 大号按钮
|
|
200
|
+
* @value normal 普通按钮(默认)
|
|
201
|
+
* @value small 小型按钮
|
|
202
|
+
* @property {String} color 自定义页码颜色,默认#1989FA
|
|
203
|
+
* @property {Boolean} showBorder = [true|false] 是否显示页码边框,默认true
|
|
204
|
+
* @property {String} layout 自定义分页排版,及是否显示 总条数(total)、首页(first)、上页(prev)、页码(page)、下页(next)、尾页(last)、每页条数选项(limit)和页码跳转(jumper),默认顺序和排版为:first,prev,page,next,last
|
|
205
|
+
* @property {String} trigger = [blur|click] 页码跳转触发方式,默认blur
|
|
206
|
+
* @value blur 失去焦点时触发(默认)
|
|
207
|
+
* @value click 点击跳转按钮触发
|
|
208
|
+
* @property {Array} pageSizes 每页条数选项预设值,默认[10, 20, 50]
|
|
209
|
+
* @event {Function} change 当页码改变时触发事件,返回参数e={currentPage,type},详情参数见文档
|
|
210
|
+
* @event {Function} sizeChange 每页条数(pageSize)改变时会触发,返回参数e={pageSize}
|
|
211
|
+
*/
|
|
212
|
+
export default {
|
|
213
|
+
name: 'PagePagination',
|
|
214
|
+
props: {
|
|
215
|
+
total: { // 总条数
|
|
216
|
+
type: Number,
|
|
217
|
+
default: 0
|
|
218
|
+
},
|
|
219
|
+
pageSize: { // 每页条数
|
|
220
|
+
type: Number,
|
|
221
|
+
default: 10
|
|
222
|
+
},
|
|
223
|
+
currentPage: { // 当前页
|
|
224
|
+
type: Number,
|
|
225
|
+
default: 1
|
|
226
|
+
},
|
|
227
|
+
showPageSize: { // 显示的页码个数
|
|
228
|
+
type: Number,
|
|
229
|
+
default: 5
|
|
230
|
+
},
|
|
231
|
+
mode: { //显示模式
|
|
232
|
+
type: String,
|
|
233
|
+
default: "multi"
|
|
234
|
+
},
|
|
235
|
+
forceEllipses: { // 是否显示省略号
|
|
236
|
+
type: Boolean,
|
|
237
|
+
default: false
|
|
238
|
+
},
|
|
239
|
+
btnText: { // 是否显示汉字
|
|
240
|
+
type: Boolean,
|
|
241
|
+
default: false
|
|
242
|
+
},
|
|
243
|
+
numAround: { // 是否用页码表示首尾页
|
|
244
|
+
type: Boolean,
|
|
245
|
+
default: false
|
|
246
|
+
},
|
|
247
|
+
size: { // 按钮大小
|
|
248
|
+
type: String,
|
|
249
|
+
default: "normal"
|
|
250
|
+
},
|
|
251
|
+
color: { // 页码颜色
|
|
252
|
+
type: String,
|
|
253
|
+
default: "#1989FA"
|
|
254
|
+
},
|
|
255
|
+
trigger: { // 跳转页码触发方式
|
|
256
|
+
type: String,
|
|
257
|
+
default: "blur"
|
|
258
|
+
},
|
|
259
|
+
layout: { // 自定义布局
|
|
260
|
+
type: String,
|
|
261
|
+
default: "first,prev,page,next,last"
|
|
262
|
+
},
|
|
263
|
+
showBorder: { // 是否显示页码边框
|
|
264
|
+
type: Boolean,
|
|
265
|
+
default: true
|
|
266
|
+
},
|
|
267
|
+
pageSizes: { // 每页条数选项预设值
|
|
268
|
+
type: Array,
|
|
269
|
+
default () {
|
|
270
|
+
return [10, 20, 50]
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
data() {
|
|
275
|
+
return {
|
|
276
|
+
nowPage: this.currentPage, //当前页
|
|
277
|
+
inputPage: this.currentPage, //input输入框绑定值
|
|
278
|
+
mLayout: [],
|
|
279
|
+
nowPageSize: this.pageSize, // 当前每页条数
|
|
280
|
+
pageSizeIndex: this.pageSizes.indexOf(this.pageSize),
|
|
281
|
+
newPageSizes: this.pageSizes.map(item => item + "条/页"),
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
watch: {
|
|
285
|
+
currentPage(val) {
|
|
286
|
+
this.nowPage = val > this.pageNum ? this.pageNum : val;
|
|
287
|
+
this.inputPage = val > this.pageNum ? this.pageNum : val;
|
|
288
|
+
if (val == 1) {
|
|
289
|
+
this.nowPage = 1;
|
|
290
|
+
this.inputPage = 1;
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
pageSize(val) {
|
|
294
|
+
this.nowPageSize = val;
|
|
295
|
+
this.pageSizeIndex = this.pageSizes.indexOf(val);
|
|
296
|
+
this.pageSizeEvent();
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
computed: {
|
|
300
|
+
// 总页数
|
|
301
|
+
pageNum() {
|
|
302
|
+
return Math.ceil(this.total / this.nowPageSize)
|
|
303
|
+
},
|
|
304
|
+
pageNumArr() { // 解决uni-app某些版本中,存在v-for中循环数字时从0开始
|
|
305
|
+
var pageNumArr = [];
|
|
306
|
+
for (let i = 0; i < this.pageNum; i++) {
|
|
307
|
+
pageNumArr.push(i + 1);
|
|
308
|
+
}
|
|
309
|
+
return pageNumArr;
|
|
310
|
+
},
|
|
311
|
+
// 计算显示的第一个页码
|
|
312
|
+
getFirstPage() {
|
|
313
|
+
let firstPage = 0;
|
|
314
|
+
let a = Math.floor((this.showPageSize - 1) / 2);
|
|
315
|
+
let b = Math.floor(this.showPageSize / 2) - 1;
|
|
316
|
+
if (this.nowPage <= a) {
|
|
317
|
+
if (!this.numAround) firstPage = 1;
|
|
318
|
+
else firstPage = 2;
|
|
319
|
+
} else if (this.nowPage >= this.pageNum - b) {
|
|
320
|
+
if (this.forceEllipses || this.numAround) firstPage = this.pageNum - this.showPageSize + 3;
|
|
321
|
+
else firstPage = this.pageNum - this.showPageSize + 1;
|
|
322
|
+
} else {
|
|
323
|
+
if (this.forceEllipses || this.numAround) firstPage = this.nowPage - a + 1;
|
|
324
|
+
else firstPage = this.nowPage - a;
|
|
325
|
+
}
|
|
326
|
+
return firstPage;
|
|
327
|
+
},
|
|
328
|
+
// 设置布局
|
|
329
|
+
setLayout() {
|
|
330
|
+
let layoutArr = this.layout.replace(/\s/g, "").split(",");
|
|
331
|
+
let arr = ["total", "limit", "jumper"];
|
|
332
|
+
this.mLayout = layoutArr.filter(item => arr.includes(item));
|
|
333
|
+
return layoutArr;
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
methods: {
|
|
337
|
+
//选择页码
|
|
338
|
+
clickPage(page) {
|
|
339
|
+
if (this.nowPage != page) {
|
|
340
|
+
this.nowPage = page;
|
|
341
|
+
this.change(page, 'page');
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
//点击上页
|
|
345
|
+
clickPrev() {
|
|
346
|
+
if (this.nowPage > 1) {
|
|
347
|
+
let nowPage = this.nowPage - 1;
|
|
348
|
+
this.nowPage = nowPage;
|
|
349
|
+
this.change(nowPage, 'prev');
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
//点击下页
|
|
353
|
+
clickNext() {
|
|
354
|
+
if (this.nowPage < this.pageNum) {
|
|
355
|
+
let nowPage = this.nowPage + 1;
|
|
356
|
+
this.nowPage = nowPage;
|
|
357
|
+
this.change(nowPage, 'next');
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
//点击首页
|
|
361
|
+
clickStart() {
|
|
362
|
+
if (this.nowPage != 1) {
|
|
363
|
+
let nowPage = 1;
|
|
364
|
+
this.nowPage = nowPage;
|
|
365
|
+
this.change(nowPage, 'homePage');
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
//点击尾页
|
|
369
|
+
clickEnd() {
|
|
370
|
+
if (this.nowPage != this.pageNum) {
|
|
371
|
+
let nowPage = this.pageNum;
|
|
372
|
+
this.nowPage = nowPage;
|
|
373
|
+
this.change(nowPage, 'endPage');
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
//页码改变时触发
|
|
377
|
+
change(nowPage, type) {
|
|
378
|
+
this.inputPage = nowPage;
|
|
379
|
+
this.$emit('change', nowPage, type);
|
|
380
|
+
},
|
|
381
|
+
onInput(e) {
|
|
382
|
+
let val = parseInt(e.target.value.replace(/[^\d]/g, ''));
|
|
383
|
+
setTimeout(_ => {
|
|
384
|
+
this.inputPage = val ? (val > this.pageNum ? this.pageNum : val) : '';
|
|
385
|
+
}, 10)
|
|
386
|
+
},
|
|
387
|
+
goPage() {
|
|
388
|
+
this.nowPage = parseInt(this.inputPage ? this.inputPage : '1');
|
|
389
|
+
this.inputPage = parseInt(this.inputPage ? this.inputPage : '1');
|
|
390
|
+
this.change(parseInt(this.inputPage), 'goPage');
|
|
391
|
+
},
|
|
392
|
+
changePageSize(e) { // 更改每页条数
|
|
393
|
+
this.pageSizeIndex = e.detail.value;
|
|
394
|
+
this.nowPageSize = this.pageSizes[e.detail.value];
|
|
395
|
+
this.pageSizeEvent();
|
|
396
|
+
},
|
|
397
|
+
pageSizeEvent() {
|
|
398
|
+
if (this.nowPage > this.pageNum) {
|
|
399
|
+
this.nowPage = this.pageNum;
|
|
400
|
+
this.inputPage = this.pageNum;
|
|
401
|
+
}
|
|
402
|
+
this.$emit('sizeChange', this.nowPageSize);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
</script>
|
|
407
|
+
|
|
408
|
+
<style lang="scss">
|
|
409
|
+
@import 'icon/iconfont.css';
|
|
410
|
+
|
|
411
|
+
$font-size: 14px;
|
|
412
|
+
$font-color: #606266;
|
|
413
|
+
|
|
414
|
+
@mixin page-input {
|
|
415
|
+
font-size: $font-size;
|
|
416
|
+
color: $font-color;
|
|
417
|
+
height: 28px;
|
|
418
|
+
line-height: 28px;
|
|
419
|
+
border: 1px solid #DCDFE6;
|
|
420
|
+
background-color: #FFF;
|
|
421
|
+
border-radius: 3px;
|
|
422
|
+
text-align: center;
|
|
423
|
+
/* #ifndef APP-NVUE */
|
|
424
|
+
cursor: not-allowed;
|
|
425
|
+
/* #endif */
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.page-pagination {
|
|
429
|
+
width: 100%;
|
|
430
|
+
/* #ifdef APP-NVUE */
|
|
431
|
+
width: 750rpx;
|
|
432
|
+
/* #endif */
|
|
433
|
+
|
|
434
|
+
.page-con {
|
|
435
|
+
width: 100%;
|
|
436
|
+
display: flex;
|
|
437
|
+
justify-content: center;
|
|
438
|
+
/* #ifdef APP-NVUE */
|
|
439
|
+
width: 750rpx;
|
|
440
|
+
/* #endif */
|
|
441
|
+
|
|
442
|
+
.page-scroll {
|
|
443
|
+
width: 100%;
|
|
444
|
+
display: flex;
|
|
445
|
+
/* #ifndef APP-NVUE */
|
|
446
|
+
overflow-x: auto;
|
|
447
|
+
overflow-y: hidden;
|
|
448
|
+
/* #endif */
|
|
449
|
+
/* #ifdef APP-NVUE */
|
|
450
|
+
width: 750rpx;
|
|
451
|
+
/* #endif */
|
|
452
|
+
|
|
453
|
+
.page-scroll-child {
|
|
454
|
+
display: flex;
|
|
455
|
+
flex-direction: row;
|
|
456
|
+
align-items: center;
|
|
457
|
+
height: 32px;
|
|
458
|
+
line-height: 30px;
|
|
459
|
+
/* #ifndef APP-NVUE */
|
|
460
|
+
margin: 0 auto;
|
|
461
|
+
padding: 0 0 0 10px;
|
|
462
|
+
|
|
463
|
+
/* #endif */
|
|
464
|
+
|
|
465
|
+
.pag-btn {
|
|
466
|
+
background-color: #FFF;
|
|
467
|
+
color: #1989FA;
|
|
468
|
+
font-size: 12px;
|
|
469
|
+
border: 1px solid #EBEEF5;
|
|
470
|
+
padding: 0 11px;
|
|
471
|
+
/* #ifndef APP-NVUE */
|
|
472
|
+
cursor: pointer;
|
|
473
|
+
white-space: nowrap;
|
|
474
|
+
/* #endif */
|
|
475
|
+
margin-left: -1px;
|
|
476
|
+
display: flex;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.page-num {
|
|
480
|
+
display: flex;
|
|
481
|
+
flex-direction: row;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.pag-btn.active {
|
|
485
|
+
background-color: #1989FA;
|
|
486
|
+
color: #FFFFFF !important;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.pag-btn.btn-ban {
|
|
490
|
+
color: #C0C4CC !important;
|
|
491
|
+
/* #ifndef APP-NVUE */
|
|
492
|
+
cursor: not-allowed;
|
|
493
|
+
/* #endif */
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
.ellipsis-btn {
|
|
497
|
+
padding: 0 1px;
|
|
498
|
+
color: #999999;
|
|
499
|
+
/* #ifndef APP-NVUE */
|
|
500
|
+
cursor: auto;
|
|
501
|
+
/* #endif */
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.pag-btn.start,
|
|
505
|
+
.pag-btn.prev,
|
|
506
|
+
.pag-btn.next,
|
|
507
|
+
.pag-btn.end,
|
|
508
|
+
.pag-btn .icon-more {
|
|
509
|
+
padding: 0 7px;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
.icon-left,
|
|
513
|
+
.icon-right {
|
|
514
|
+
font-size: 13px;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.icon-left1,
|
|
518
|
+
.icon-right1 {
|
|
519
|
+
font-size: 17px;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// 简单模式
|
|
523
|
+
.page-num.simple {
|
|
524
|
+
padding: 0 40px;
|
|
525
|
+
line-height: 34px;
|
|
526
|
+
color: #303133;
|
|
527
|
+
font-size: 16px;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// 无边框模式
|
|
534
|
+
.no-border .page-scroll .page-scroll-child {
|
|
535
|
+
.pag-btn {
|
|
536
|
+
/* #ifndef APP-NVUE */
|
|
537
|
+
border: none;
|
|
538
|
+
background: none;
|
|
539
|
+
/* #endif */
|
|
540
|
+
/* #ifdef APP-NVUE */
|
|
541
|
+
border: rgba(255, 255, 255, 0);
|
|
542
|
+
background-color: rgba(255, 255, 255, 0);
|
|
543
|
+
/* #endif */
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
.pag-btn.active {
|
|
547
|
+
border-radius: 4px;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.pag-btn.start,
|
|
551
|
+
.pag-btn.prev,
|
|
552
|
+
.pag-btn.next,
|
|
553
|
+
.pag-btn.end {
|
|
554
|
+
background-color: #F0F0F0 !important;
|
|
555
|
+
border-radius: 4px;
|
|
556
|
+
margin: 0 3px;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
.page-num {
|
|
560
|
+
margin: 0 3px;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// 移动端
|
|
565
|
+
.mobile-page {
|
|
566
|
+
display: flex;
|
|
567
|
+
justify-content: center;
|
|
568
|
+
flex-direction: row;
|
|
569
|
+
align-items: center;
|
|
570
|
+
line-height: 28px;
|
|
571
|
+
margin-top: 5px;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/* 附加功能样式 */
|
|
575
|
+
// 总条数
|
|
576
|
+
.page-total {
|
|
577
|
+
display: flex;
|
|
578
|
+
color: $font-color;
|
|
579
|
+
font-size: $font-size;
|
|
580
|
+
margin: 0 5px;
|
|
581
|
+
/* #ifndef APP-NVUE */
|
|
582
|
+
white-space: nowrap;
|
|
583
|
+
/* #endif */
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// 每页条数
|
|
587
|
+
.page-limit {
|
|
588
|
+
margin: 0 5px;
|
|
589
|
+
display: flex;
|
|
590
|
+
align-items: center;
|
|
591
|
+
position: relative;
|
|
592
|
+
/* #ifndef APP-NVUE */
|
|
593
|
+
white-space: nowrap;
|
|
594
|
+
/* #endif */
|
|
595
|
+
|
|
596
|
+
.page-input {
|
|
597
|
+
@include page-input;
|
|
598
|
+
/* #ifndef APP-NVUE */
|
|
599
|
+
outline: none;
|
|
600
|
+
/* #endif */
|
|
601
|
+
padding: 0 18px 0 6px;
|
|
602
|
+
display: flex;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
.icon-left {
|
|
606
|
+
position: absolute;
|
|
607
|
+
right: 3px;
|
|
608
|
+
top: 1px;
|
|
609
|
+
color: #C0C4CC;
|
|
610
|
+
font-size: 12px;
|
|
611
|
+
font-weight: 100;
|
|
612
|
+
transform: rotate(-90deg);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// 跳转页码
|
|
617
|
+
.page-go {
|
|
618
|
+
color: $font-color;
|
|
619
|
+
font-size: $font-size;
|
|
620
|
+
display: flex;
|
|
621
|
+
flex-direction: row;
|
|
622
|
+
align-items: center;
|
|
623
|
+
margin: 0 5px;
|
|
624
|
+
/* #ifndef APP-NVUE */
|
|
625
|
+
white-space: nowrap;
|
|
626
|
+
/* #endif */
|
|
627
|
+
|
|
628
|
+
.page-input {
|
|
629
|
+
@include page-input;
|
|
630
|
+
width: 46px;
|
|
631
|
+
margin: 0 5px;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
.page-input-btn {
|
|
635
|
+
@include page-input;
|
|
636
|
+
padding: 0 10px;
|
|
637
|
+
margin-left: 5px;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// 自定义页码信息
|
|
642
|
+
.custom-info {
|
|
643
|
+
margin: 0 10px;
|
|
644
|
+
color: $font-color;
|
|
645
|
+
font-size: $font-size;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// 大号模式
|
|
650
|
+
.page-pagination.size-large .page-con .page-scroll-child {
|
|
651
|
+
height: 40px;
|
|
652
|
+
line-height: 38px;
|
|
653
|
+
|
|
654
|
+
.pag-btn {
|
|
655
|
+
padding: 0 15px;
|
|
656
|
+
font-size: 15px;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.pag-btn.start,
|
|
660
|
+
.pag-btn.prev,
|
|
661
|
+
.pag-btn.next,
|
|
662
|
+
.pag-btn.end,
|
|
663
|
+
.ellipsis-btn {
|
|
664
|
+
padding: 0 12px;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
.pag-btn.btn-text {
|
|
668
|
+
padding: 0 6px;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
.icon-left,
|
|
672
|
+
.icon-right {
|
|
673
|
+
font-size: 15px;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
.icon-left1,
|
|
677
|
+
.icon-right1 {
|
|
678
|
+
font-size: 19px;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// 小号按钮
|
|
683
|
+
.page-pagination.size-small .page-con .page-scroll-child {
|
|
684
|
+
height: 24px;
|
|
685
|
+
line-height: 22px;
|
|
686
|
+
|
|
687
|
+
.pag-btn {
|
|
688
|
+
padding: 0 7px;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
.pag-btn.start,
|
|
692
|
+
.pag-btn.prev,
|
|
693
|
+
.pag-btn.next,
|
|
694
|
+
.pag-btn.end {
|
|
695
|
+
padding: 0 5px;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
.ellipsis-btn {
|
|
699
|
+
padding: 0 5px;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.icon-left,
|
|
703
|
+
.icon-right {
|
|
704
|
+
font-size: 12px;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.icon-left1,
|
|
708
|
+
.icon-right1 {
|
|
709
|
+
font-size: 15px;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/* #ifndef APP-NVUE */
|
|
714
|
+
.page-pagination .pc-page {
|
|
715
|
+
display: none;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
.page-pagination .mobile-page {
|
|
719
|
+
display: flex;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
@media screen and (min-width: 450px) {
|
|
723
|
+
.page-pagination .pc-page {
|
|
724
|
+
display: block;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
.page-pagination .mobile-page {
|
|
728
|
+
display: none;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
/* #endif */
|
|
733
|
+
</style>
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
## 分页器
|
|
2
|
+
### 简单介绍
|
|
3
|
+
- 组件需要依赖 sass 插件 ,请自行安装;
|
|
4
|
+
- 可自定义显示分页信息,如总条数,每页条数等;
|
|
5
|
+
- 欢迎大家下载使用,项目源码示例:[https://gitee.com/lunc9932/pagination](https://gitee.com/lunc9932/pagination)
|
|
6
|
+
- 若有插件导入失败,重启编辑器;
|
|
7
|
+
|
|
8
|
+
### API
|
|
9
|
+
#### 属性说明
|
|
10
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
11
|
+
|---------------|---------|---------|-----------------------|
|
|
12
|
+
| total | Number | 0 | 数据总条数 |
|
|
13
|
+
| pageSize | Number | 10 | 每页显示条数 |
|
|
14
|
+
| currentPage | Number | 1 | 当前页数 |
|
|
15
|
+
| mode | String | multi | 显示模式,可选值:multi / simple<br>multi:标准模式;simple:简单模式,只显示当前页/总页数 |
|
|
16
|
+
| btnText | Boolean | false | 上页、下页、首页和尾页是否使用汉字,默认使用箭头表示 |
|
|
17
|
+
| numAround | Boolean | false | 是否保留页码中的第一页和最后一个,为true时不再显示首页和尾页,且中间默认使用省略号 |
|
|
18
|
+
| forceEllipses | Boolean | false | 总页码数 超过`showPageSize`时,两端页码是否显示省略号 |
|
|
19
|
+
| showPageSize | Number | 5 | 显示的页码个数,当使用`numAround`和`forceEllipses`属性时,中间显示的页码个数将 减2 |
|
|
20
|
+
| size | String | normal | 按钮大小,可选值:large / normal / small<br>large:大号按钮;normal:普通按钮(默认);small:小型按钮 |
|
|
21
|
+
| color | String | #1989FA | 自定义按钮文字颜色 |
|
|
22
|
+
| showBorder | Boolean | true | 是否显示按钮页码边框 |
|
|
23
|
+
| layout | String | first,prev,page,next,last | 自定义分页排版,是否显示 总条数(total)、首页(first)、上页(prev)、页码(page)、下页(next)、尾页(last)、每页条数选项(limit)和页码跳转(jumper),中间用英文逗号分隔 |
|
|
24
|
+
| trigger | String | blur | 页码input输入框跳转页码触发方式,当`layout`值中包含 jumper 此项才生效,可选值:blur / click<br>blur:失去焦点时触发(不显示跳转按钮);click:点击跳转按钮触发 |
|
|
25
|
+
| pageSizes | Array | [10, 20, 50] | 每页条数选项预设值,可选择每页条数,当`layout`值中包含 limit 此项才生效 |
|
|
26
|
+
|
|
27
|
+
注意:
|
|
28
|
+
1. 当`showPageSize`属性数值过大时,可能会出现横向滚动条;
|
|
29
|
+
2. 当`showPageSize`属性数值小于3,且`forceEllipses`或`numAround`为 true 时,中间页码将无法显示;
|
|
30
|
+
3. 只有当 总页码数 超过`showPageSize`,且属性`forceEllipses`或`numAround`为 true 时,省略号才能显示出来;
|
|
31
|
+
4. `layout`分页排版,同样可自定义分页信息显示顺序;
|
|
32
|
+
5. 自定义分页信息只需在`<page-pagination>`标签内自定义即可,并不需要写属性;
|
|
33
|
+
6. **原`showAround`(是否显示首尾页)、`showPageInfo`(是否显示分页信息)和`showGoPage`(是否显示input输入框)属性已失效,功能已合并到`layout`属性中;**
|
|
34
|
+
7. 由于移动端屏幕宽度限制,total、limit和jumper 将显示在页码的下面;PC端(>=450px,可自行在组件样式中修改)显示一行且按照`layout`属性中的顺序显示;
|
|
35
|
+
8. 总条数(total)和当前页数(currentPage)是可以动态改变的,请参考项目示例;
|
|
36
|
+
|
|
37
|
+
#### 事件说明
|
|
38
|
+
| 事件名 | 说明 | 返回值 |
|
|
39
|
+
|--------------|---------------------|-----------------------------------|
|
|
40
|
+
| @change | 页码改变时触发 | 返回值e={currentPage(Number),type(String)},currentPage:当前页;type:点击的类型,详细见下面说明 |
|
|
41
|
+
| @sizeChange | 切换每页条数选项预设值 改变`pageSize`时触发| 返回值e={pageSize(Number)},pageSize:每页条数 |
|
|
42
|
+
|
|
43
|
+
##### type返回类型
|
|
44
|
+
| 类型 | 说明 |
|
|
45
|
+
| -------- | ---- |
|
|
46
|
+
| page | 表示点击的是页码 |
|
|
47
|
+
| prev | 点击的是上页 |
|
|
48
|
+
| next | 点击的是下页 |
|
|
49
|
+
| homePage | 点击的是首页 |
|
|
50
|
+
| endPage | 点击的是尾页 |
|
|
51
|
+
| goPage | 页码input输入框触发 |
|
|
52
|
+
|
|
53
|
+
注意:
|
|
54
|
+
1. 重复点击同一个页码,不会触发 change 事件,避免不必要的刷新;
|
|
55
|
+
|
|
56
|
+
### 基本用法
|
|
57
|
+
在`template`中使用组件
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
<view class="example-con">总页数:{{page.total}},当前第{{page.currentPage}}页</view>
|
|
61
|
+
<view class="example-btn">
|
|
62
|
+
<view @click="changeTotal">更改总页数555条</view>
|
|
63
|
+
<view style="margin-left: 50px;" @click="changeCurrentPage">更改到第3页</view>
|
|
64
|
+
</view>
|
|
65
|
+
|
|
66
|
+
<view class="title">默认</view>
|
|
67
|
+
<page-pagination :total="page.total" :pageSize="page.pageSize" :currentPage="page.currentPage"
|
|
68
|
+
@change="change"></page-pagination>
|
|
69
|
+
|
|
70
|
+
<view class="title">简单模式(mode="simple")</view>
|
|
71
|
+
<page-pagination :total="page.total" mode="simple"></page-pagination>
|
|
72
|
+
|
|
73
|
+
<view class="title">无边框(showBorder="false")</view>
|
|
74
|
+
<page-pagination :total="page.total" :currentPage="page.currentPage" :showBorder="false"></page-pagination>
|
|
75
|
+
|
|
76
|
+
<view class="title">使用汉字表示(btnText)及显示省略号(forceEllipses)</view>
|
|
77
|
+
<page-pagination :total="page.total" :btnText="true" :forceEllipses="true"></page-pagination>
|
|
78
|
+
|
|
79
|
+
<view class="title">保留页码中的第一页和最后一页(numAround)</view>
|
|
80
|
+
<page-pagination :total="page.total" :numAround="true" :showBorder="false"></page-pagination>
|
|
81
|
+
|
|
82
|
+
<view class="title">附加功能(总条数、每页条数 及 页码跳转)(layout)</view>
|
|
83
|
+
<page-pagination :total="page.total" layout="total,first,prev,page,next,last,limit,jumper"></page-pagination>
|
|
84
|
+
|
|
85
|
+
<view class="title">附加功能自定义显示分页项及排列顺序 和<br>自定义每页显示个数选择器的选项设置(pageSizes)</view>
|
|
86
|
+
<page-pagination class="test-pagination" :numAround="true" :total="page.total" layout="page,prev,next,limit,total"
|
|
87
|
+
:pageSizes="[10,50,60,100]" @sizeChange="sizeChange">
|
|
88
|
+
</page-pagination>
|
|
89
|
+
|
|
90
|
+
<view class="title">自定义显示分页信息</view>
|
|
91
|
+
<page-pagination :total="page.total" :pageSize="page.pageSize" :showBorder="false" :numAround="true">
|
|
92
|
+
<view>total:{{page.total}},pageSize:{{page.pageSize}}</view>
|
|
93
|
+
</page-pagination>
|
|
94
|
+
|
|
95
|
+
<view class="title">大号按钮(size="large")</view>
|
|
96
|
+
<page-pagination :total="page.total" :showBorder="false" :showPageSize="4" size="large"></page-pagination>
|
|
97
|
+
|
|
98
|
+
<view class="title">小型按钮(size="small")</view>
|
|
99
|
+
<page-pagination :total="page.total" :showBorder="false" :showPageSize="6" size="small"></page-pagination>
|
|
100
|
+
|
|
101
|
+
<view class="title">自定义颜色(color="#F56C6C")</view>
|
|
102
|
+
<page-pagination :total="page.total" :forceEllipses="true" :btnText="true" color="#F56C6C"></page-pagination>
|
|
103
|
+
<page-pagination :total="page.total" :forceEllipses="true" :btnText="true" color="#67C23A"></page-pagination>
|
|
104
|
+
<page-pagination :total="page.total" :forceEllipses="true" :btnText="true" color="#FF00E3"></page-pagination>
|
|
105
|
+
```
|
|
106
|
+
在`script`中使用
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
export default {
|
|
110
|
+
data() {
|
|
111
|
+
return {
|
|
112
|
+
page: {
|
|
113
|
+
total: 10000,
|
|
114
|
+
pageSize: 50,
|
|
115
|
+
currentPage: 2
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
methods: {
|
|
120
|
+
change(currentPage, type) { // 当前页改变
|
|
121
|
+
this.page.currentPage = currentPage;
|
|
122
|
+
console.log("点击了" + type + ",当前页:" + currentPage);
|
|
123
|
+
},
|
|
124
|
+
sizeChange(pageSize) { // 每页条数改变
|
|
125
|
+
this.page.pageSize = pageSize;
|
|
126
|
+
console.log("每页", pageSize, "条");
|
|
127
|
+
},
|
|
128
|
+
changeTotal() { // 更改总条数
|
|
129
|
+
this.page.total = 555
|
|
130
|
+
},
|
|
131
|
+
changeCurrentPage() { // 更改当前页
|
|
132
|
+
this.page.currentPage = 3
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|