cosmoim-852 fix 补料创建 新增分页功能
parent
4e1f92168e
commit
a7f77e0c75
@ -0,0 +1,20 @@
|
|||||||
|
@font-face {font-family: "iconfont";
|
||||||
|
src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAALUAAsAAAAABtwAAAKFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCfgqBQIE1ATYCJAMMCwgABCAFhG0HRBsBBhEVjCOyrw7sYPj4I0QqzNq3zfnzDrGGnxGGLSGIJLifI6jWsJ7dDaIDIM/lo6IIVFyEAVaJdC8Ma5KsX18DIvAAvNrML65E6KwwVPnjwadURdk9jquzLCnj43Q3FiERMuvuW6CtkLIwkLa2RJ8WB1673A9cYIWJ1mV/lpeyxOTL57kc310BZdH8QIGltvZ+PiZgggWyN0aRFViUecPYBS/wPoFG/WbFduUD1CvsZYG41DlCfSGsKCxXL9Q27C3iTY369JLe4zX6fPyzHJHUZPZDOxcuwfrP5M0rFXuZ6+WcYIfImEUhdhvTO7JgjKwxXYxyrGnBz/RX/EwCqzgqMxF/nVvdDCahKj2RxFN7NAk8IIEMapPsCjYQvTsQUof9hYqOoxqqWHWbqJ9LAh/W3Mq8UOvnzz9Gr1/8fZwsnhvGHNLy5fPH0Q1H/TAu1g7uN/MIVHJPFhG/fhEIau4W/277/5oK+Govv4JgpdC81J/RE/w9ycCuYshsSy6a2BNb3mx4ojMBhdynmu3v9GO6tmdwNaFeT4akTh+yeqNEoc+iRpNV1KonXkOjGfXhJl3YXpQGTPsACO0+kbR6h6zdQhT6ihq9/lGrPfZotBtdZzYZD33YYmwEe2jfQXfBk2uTQ1x7hWq2DedlEesOedIxKNK8nKvRIy+xYXpRpQgBcXBQgcfQ2gCRw4idpINIPGcZNb0o7YLbHGxhqCFQD7TeAa0TeBQMFofK+68gZWY1uKOuzn8HsYkeHhRS+QCiVvtBdY/yzOSFUhKCAMICB1RgFrKsAMTmWSPUEalhQjI6y5x+NFSdbq91P1DEmrDX5EiRo2g8a/yovQUS5ourYW68Kpg2GwAAAA==') format('woff2')
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
font-family: "iconfont" !important;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-danjiantou:before {
|
||||||
|
content: "\e62d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-shuangjiantou:before {
|
||||||
|
content: "\e62e";
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,424 @@
|
|||||||
|
<template>
|
||||||
|
<view
|
||||||
|
class="wyb-pagination-box"
|
||||||
|
:style="{
|
||||||
|
paddingLeft: padding + 'rpx',
|
||||||
|
paddingRight: padding + 'rpx',
|
||||||
|
'--hover': autoHover,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<view class="wyb-pagination-left" :style="{ opacity: currentPage === 1 ? 0.5 : 1 }">
|
||||||
|
<view v-if="showFirst" :class="'wyb-pagination-first-page-' + (showIcon ? 'i' : 't')" :style="btnStyleStr" :hover-class="currentPage === 1 ? '' : 'wyb-pagination-hover'" @tap="onPageBtnTap('first-page')">
|
||||||
|
<view v-if="showIcon" class="iconfont icon-shuangjiantou left-arrow" />
|
||||||
|
<text v-else>{{ firstText }}</text>
|
||||||
|
</view>
|
||||||
|
<view :class="'wyb-pagination-prev-page-' + (showIcon ? 'i' : 't')" :style="btnStyleStr" :hover-class="currentPage === 1 ? '' : 'wyb-pagination-hover'" @tap="onPageBtnTap('prev-page')">
|
||||||
|
<view v-if="showIcon" class="iconfont icon-danjiantou left-arrow" />
|
||||||
|
<text v-else>{{ prevText }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="wyb-pagination-info" @tap.stop="onInfoTap">
|
||||||
|
<view class="wyb-pagination-num" v-if="!infoClick">
|
||||||
|
<text :style="{ color: currentColor }">{{ currentPage }}</text>
|
||||||
|
<text class="wyb-pagination-span" :style="{ color: pageInfoColor }">/</text>
|
||||||
|
<text :style="{ color: pageInfoColor }">{{ totalPage }}</text>
|
||||||
|
<text v-if="showTotalItem" class="wyb-pagination-info-total" :style="{ color: RGBChange(pageInfoColor, 0.5, 'light') }"> ({{ totalItems }}) </text>
|
||||||
|
</view>
|
||||||
|
<!-- #ifndef MP-WEIXIN || APP-VUE || APP-NVUE || APP-PLUS || APP-PLUS-NVUE -->
|
||||||
|
<view class="wyb-pagination-input" v-else>
|
||||||
|
<input type="number" v-model="inputPage" :onpaste="false" :focus="infoFocus" :value="currentPage" :style="{ color: currentColor }" :cursor-spacing="cursorSpacing" @confirm="onInfoConfirm" @blur="onInfoBlur" />
|
||||||
|
</view>
|
||||||
|
<!-- #endif -->
|
||||||
|
<!-- #ifdef MP-WEIXIN || APP-VUE || APP-NVUE || APP-PLUS || APP-PLUS-NVUE -->
|
||||||
|
<!-- <view class="wyb-pagination-input" v-else>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
v-model="inputPage"
|
||||||
|
:focus="infoFocus"
|
||||||
|
:name="currentPage"
|
||||||
|
:style="{color: currentColor}"
|
||||||
|
:cursor-spacing="cursorSpacing"
|
||||||
|
@confirm="onInfoConfirm"
|
||||||
|
@blur="onInfoBlur" />
|
||||||
|
</view> -->
|
||||||
|
<!-- #endif -->
|
||||||
|
</view>
|
||||||
|
<view class="wyb-pagination-right" :style="{ opacity: currentPage === totalPage ? 0.5 : 1 }">
|
||||||
|
<view :class="'wyb-pagination-next-page-' + (showIcon ? 'i' : 't')" :style="btnStyleStr" :hover-class="currentPage === totalPage ? '' : 'wyb-pagination-hover'" @tap="onPageBtnTap('next-page')">
|
||||||
|
<view v-if="showIcon" class="iconfont icon-danjiantou right-arrow" />
|
||||||
|
<text v-else>{{ nextText }}</text>
|
||||||
|
</view>
|
||||||
|
<view v-if="showLast" :class="'wyb-pagination-last-page-' + (showIcon ? 'i' : 't')" :style="btnStyleStr" :hover-class="currentPage === totalPage ? '' : 'wyb-pagination-hover'" @tap="onPageBtnTap('last-page')">
|
||||||
|
<view v-if="showIcon" class="iconfont icon-shuangjiantou right-arrow" />
|
||||||
|
<text v-else>{{ lastText }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
currentPage: this.current || 1,
|
||||||
|
inputPage: '',
|
||||||
|
infoClick: false,
|
||||||
|
infoFocus: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
totalPage() {
|
||||||
|
return Math.ceil(parseFloat(this.totalItems) / parseFloat(this.pageItems));
|
||||||
|
},
|
||||||
|
autoHover() {
|
||||||
|
if (this.btnStyle.backgroundColor) {
|
||||||
|
return this.RGBChange(this.btnStyle.backgroundColor, 0.1, 'dark');
|
||||||
|
} else {
|
||||||
|
return this.RGBChange('#f8f8f8', 0.05, 'dark');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
btnStyleStr() {
|
||||||
|
let styleStr = '';
|
||||||
|
for (let key in this.btnStyle) {
|
||||||
|
styleStr += `${this.sortFieldMatch(key)}: ${this.btnStyle[key]}; `;
|
||||||
|
}
|
||||||
|
return styleStr;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
current(val) {
|
||||||
|
const oPage = this.currentPage;
|
||||||
|
if (!Object.is(oPage, val)) {
|
||||||
|
this.currentPage = val;
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'prop-page',
|
||||||
|
current: this.currentPage,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
totalItems: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 20,
|
||||||
|
},
|
||||||
|
pageItems: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 5,
|
||||||
|
},
|
||||||
|
current: {
|
||||||
|
type: Number,
|
||||||
|
default: 1,
|
||||||
|
},
|
||||||
|
prevText: {
|
||||||
|
type: String,
|
||||||
|
default: '上一页',
|
||||||
|
},
|
||||||
|
nextText: {
|
||||||
|
type: String,
|
||||||
|
default: '下一页',
|
||||||
|
},
|
||||||
|
firstText: {
|
||||||
|
type: String,
|
||||||
|
default: '首页',
|
||||||
|
},
|
||||||
|
lastText: {
|
||||||
|
type: String,
|
||||||
|
default: '尾页',
|
||||||
|
},
|
||||||
|
pageInfoColor: {
|
||||||
|
type: String,
|
||||||
|
default: '#494949',
|
||||||
|
},
|
||||||
|
currentColor: {
|
||||||
|
type: String,
|
||||||
|
default: '#007aff',
|
||||||
|
},
|
||||||
|
padding: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 15,
|
||||||
|
},
|
||||||
|
btnStyle: {
|
||||||
|
type: Object,
|
||||||
|
default() {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
showIcon: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
showTotalItem: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
showFirst: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
showLast: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
couldInput: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
cursorSpacing: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onPageBtnTap(type) {
|
||||||
|
switch (type) {
|
||||||
|
case 'first-page':
|
||||||
|
if (!Object.is(this.currentPage, 1)) {
|
||||||
|
this.currentPage = 1;
|
||||||
|
this.$emit('change', { type, current: this.currentPage });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'prev-page':
|
||||||
|
if (!Object.is(this.currentPage, 1)) {
|
||||||
|
this.currentPage--;
|
||||||
|
this.$emit('change', { type, current: this.currentPage });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'next-page':
|
||||||
|
if (!Object.is(this.currentPage, this.totalPage)) {
|
||||||
|
this.currentPage++;
|
||||||
|
this.$emit('change', { type, current: this.currentPage });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'last-page':
|
||||||
|
if (!Object.is(this.currentPage, this.totalPage)) {
|
||||||
|
this.currentPage = this.totalPage;
|
||||||
|
this.$emit('change', { type, current: this.currentPage });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onInfoTap() {
|
||||||
|
if (this.couldInput) {
|
||||||
|
this.infoClick = true;
|
||||||
|
this.inputPage = this.currentPage;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.infoFocus = true;
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onInfoConfirm(e) {
|
||||||
|
let input = e.detail.value;
|
||||||
|
const oPage = this.currentPage;
|
||||||
|
if (parseFloat(input) > this.totalPage) {
|
||||||
|
this.currentPage = this.totalPage;
|
||||||
|
} else if (parseFloat(input) < 1) {
|
||||||
|
this.currentPage = 1;
|
||||||
|
} else if (input === '') {
|
||||||
|
this.currentPage = oPage;
|
||||||
|
} else {
|
||||||
|
this.currentPage = parseFloat(input);
|
||||||
|
}
|
||||||
|
if (!Object.is(oPage, this.currentPage)) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'input-page',
|
||||||
|
current: this.currentPage,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.infoClick = false;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.infoFocus = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onInfoBlur(e) {
|
||||||
|
let input = e.detail.value;
|
||||||
|
const oPage = this.currentPage;
|
||||||
|
if (parseFloat(input) > this.totalPage) {
|
||||||
|
this.currentPage = this.totalPage;
|
||||||
|
} else if (parseFloat(input) < 1) {
|
||||||
|
this.currentPage = 1;
|
||||||
|
} else if (input === '') {
|
||||||
|
this.currentPage = oPage;
|
||||||
|
} else {
|
||||||
|
this.currentPage = parseFloat(input);
|
||||||
|
}
|
||||||
|
if (!Object.is(oPage, this.currentPage)) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'input-page',
|
||||||
|
current: this.currentPage,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.infoClick = false;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.infoFocus = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
RGBChange(color, level, type) {
|
||||||
|
// 判断颜色类型
|
||||||
|
let r = 0,
|
||||||
|
g = 0,
|
||||||
|
b = 0,
|
||||||
|
hasAlpha = false,
|
||||||
|
alpha = 1;
|
||||||
|
if (color.indexOf('#') !== -1) {
|
||||||
|
// hex转rgb
|
||||||
|
if (color.length === 4) {
|
||||||
|
let arr = color.split('');
|
||||||
|
color = '#' + arr[1] + arr[1] + arr[2] + arr[2] + arr[3] + arr[3];
|
||||||
|
}
|
||||||
|
let color16List = [color.substring(1, 3), color.substring(3, 5), color.substring(5, 7)];
|
||||||
|
r = parseInt(color16List[0], 16);
|
||||||
|
g = parseInt(color16List[1], 16);
|
||||||
|
b = parseInt(color16List[2], 16);
|
||||||
|
} else {
|
||||||
|
hasAlpha = color.indexOf('a') !== -1;
|
||||||
|
let root = color.slice();
|
||||||
|
let idx = root.indexOf('(') + 1;
|
||||||
|
root = root.substring(idx);
|
||||||
|
let firstDotIdx = root.indexOf(',');
|
||||||
|
r = parseFloat(root.substring(0, firstDotIdx));
|
||||||
|
root = root.substring(firstDotIdx + 1);
|
||||||
|
let secondDotIdx = root.indexOf(',');
|
||||||
|
g = parseFloat(root.substring(0, secondDotIdx));
|
||||||
|
root = root.substring(secondDotIdx + 1);
|
||||||
|
if (hasAlpha) {
|
||||||
|
let thirdDotIdx = root.indexOf(',');
|
||||||
|
b = parseFloat(root.substring(0, thirdDotIdx));
|
||||||
|
alpha = parseFloat(root.substring(thirdDotIdx + 1));
|
||||||
|
} else {
|
||||||
|
b = parseFloat(root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let rgbc = [r, g, b];
|
||||||
|
// 减淡或加深
|
||||||
|
for (var i = 0; i < 3; i++) type === 'light' ? (rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i])) : (rgbc[i] = Math.floor(rgbc[i] * (1 - level)));
|
||||||
|
|
||||||
|
if (hasAlpha) {
|
||||||
|
return `rgba(${rgbc[0]}, ${rgbc[1]}, ${rgbc[2]}, ${alpha})`;
|
||||||
|
} else {
|
||||||
|
return `rgb(${rgbc[0]}, ${rgbc[1]}, ${rgbc[2]})`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sortFieldMatch(field) {
|
||||||
|
const stringArray = field.split('');
|
||||||
|
let newField = field;
|
||||||
|
stringArray.forEach((t) => {
|
||||||
|
if (/[A-Z]/.test(t)) {
|
||||||
|
newField = field.replace(t, `-${t.toLowerCase()}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return newField;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@import 'iconfont.css';
|
||||||
|
.wyb-pagination-box {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
box-sizing: border-box;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-left {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-right {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-first-page-t,
|
||||||
|
.wyb-pagination-prev-page-t,
|
||||||
|
.wyb-pagination-next-page-t,
|
||||||
|
.wyb-pagination-last-page-t {
|
||||||
|
font-size: 27rpx;
|
||||||
|
padding: 14rpx 25rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px solid #e5e5e5;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-first-page-i,
|
||||||
|
.wyb-pagination-prev-page-i,
|
||||||
|
.wyb-pagination-next-page-i,
|
||||||
|
.wyb-pagination-last-page-i {
|
||||||
|
font-size: 27rpx;
|
||||||
|
padding: 14rpx 33rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px solid #e5e5e5;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-first-page-t,
|
||||||
|
.wyb-pagination-first-page-i {
|
||||||
|
margin-right: 15rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-last-page-t,
|
||||||
|
.wyb-pagination-last-page-i {
|
||||||
|
margin-left: 15rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-info {
|
||||||
|
font-size: 33rpx;
|
||||||
|
white-space: nowrap;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-input input {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-span {
|
||||||
|
margin: 0 2rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-info-total {
|
||||||
|
margin-left: 10rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wyb-pagination-first-page-t:active,
|
||||||
|
.wyb-pagination-prev-page-t:active,
|
||||||
|
.wyb-pagination-next-page-t:active,
|
||||||
|
.wyb-pagination-last-page-t:active,
|
||||||
|
.wyb-pagination-first-page-i:active,
|
||||||
|
.wyb-pagination-prev-page-i:active,
|
||||||
|
.wyb-pagination-next-page-i:active,
|
||||||
|
.wyb-pagination-last-page-i:active {
|
||||||
|
background-color: var(--hover) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-arrow {
|
||||||
|
transform: scale(0.9);
|
||||||
|
margin-right: 5rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-arrow {
|
||||||
|
margin-left: 5rpx;
|
||||||
|
transform: scale(0.9) rotate(180deg);
|
||||||
|
-webkit-transform: scale(0.8) rotate(180deg);
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue