123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <template>
- <view class="tm-pagination flex-center">
- <view v-if="tal" class="flex-start flex-wrap flex-between fulled">
- <tm-button :fllowTheme="false" :shadow="4" :icon-size="24"
- :font-color="nowIndex==1||disabled?'grey':color_tmeme" :black="black_tmeme" @click="tv_pre"
- :disabled="nowIndex==1||disabled" theme="white" :item-class="round?'rounded':''" block height="64" width="64"
- icon="icon-angle-left"></tm-button>
- <block v-for="(item,index) in items " :key="index">
- <tm-button :fllowTheme="false" :shadow="4" :disabled="disabled" :black="black_tmeme"
- :theme="item==nowIndex?color_tmeme:'white'" @click="clicPages(item)" block
- :item-class="round?'rounded':''" height="64" width="64">
- {{item}}
- </tm-button>
- </block>
- <tm-button :fllowTheme="false" :shadow="4" :icon-size="24"
- :font-color="nowIndex==tal||disabled?'grey':color_tmeme" :black="black_tmeme" theme="white"
- @click="tv_next" :disabled="nowIndex==tal||disabled?true:false" :item-class="round?'rounded':''" block
- height="64" width="64" icon="icon-angle-right">
- </tm-button>
- </view>
- </view>
- </template>
- <script>
- /**
- * 分页
- * @property {Function} change 页面改变时触发。
- * @property {Number} page = [] 默认:1当前页码,必须使用page.sync
- * @property {Number} total-visible = [] 默认:5最大可见页数
- * @property {Number} total = [] 默认:0总条数。
- * @property {Number} size = [] 默认:8每页的数量。
- * @property {Boolean} round = [] 默认:false,是否圆形按钮。
- * @property {Boolean} black = [] 默认:false,是否暗黑模式
- * @property {Boolean} disabled = [] 默认:false,禁用
- * @property {String} color = [] 默认:primary,选中的主题色
- * @example <tm-pagination :page.sync="page" :total="100"></tm-pagination>
- */
- import tmButton from "@/tm-vuetify/components/tm-button/tm-button.vue"
- export default {
- components: {
- tmButton
- },
- name: "tm-pagination",
- props: {
- total: {
- type: Number,
- default: 0
- },
- // 最大可见按钮数量。
- totalVisible: {
- type: Number,
- default: 5
- },
- // 当前页码。需要page.sync同步。
- page: {
- type: Number,
- default: 1
- },
- // 每页的数量 。
- size: {
- type: Number,
- default: 10
- },
- // 是否圆形按钮。
- round: {
- type: Boolean,
- default: false
- },
- // 是否暗黑模式
- black: {
- type: Boolean | String,
- default: null
- },
- // 主题色
- color: {
- type: String,
- default: 'primary'
- },
- disabled: {
- type: Boolean,
- default: false
- },
- // 跟随主题色的改变而改变。
- fllowTheme: {
- type: Boolean | String,
- default: true
- }
- },
- watch: {
- page: function(val) {
- this.init()
- }
- },
- computed: {
- black_tmeme: function() {
- if (this.black !== null) return this.black;
- return this.$tm.vx.state().tmVuetify.black;
- },
- color_tmeme: function() {
- if (this.$tm.vx.state().tmVuetify.color !== null && this.$tm.vx.state().tmVuetify.color && this
- .fllowTheme) {
- return this.$tm.vx.state().tmVuetify.color;
- }
- return this.color;
- },
- //总共的页码。
- tal: function() {
- if (this.total <= this.size) return 1;
- let isInt = this.total % this.size;
- let ds = this.total / this.size;
- return isInt == 0 ? Math.floor(ds) : Math.floor(ds) + 1;
- },
- items: function() {
-
- const totalVisible = parseInt(this.totalVisible, 10)<=5?5:parseInt(this.totalVisible, 10);
- if(this.tal<=totalVisible){
- return this.range(1, this.tal)
- }
- if (totalVisible === 0) {
- return []
- }
- const maxLength = Math.min(
- Math.max(0, totalVisible) || this.tal,
- Math.max(0, this.maxButtons) || this.tal,
- this.tal
- )
- if (this.tal <= maxLength) {
- return this.range(1, this.tal)
- }
- const even = maxLength % 2 === 0 ? 1 : 0
- const left = Math.floor(maxLength / 2)
- const right = this.tal - left + 1 + even
- if (this.page > left && this.page < right) {
- const firstItem = 1
- const lastItem = this.tal
- const start = this.page - left + 2
- const end = this.page + left - 2 - even
- const secondItem = start - 1 === firstItem + 1 ? 2 : '...'
- const beforeLastItem = end + 1 === lastItem - 1 ? end + 1 : '...'
- return [1, secondItem, ...this.range(start, end), beforeLastItem, this.tal]
- } else if (this.page === left) {
- const end = this.page + left - 1 - even
- return [...this.range(1, end), '...', this.tal]
- } else if (this.page === right) {
- const start = this.page - left + 1
- return [1, '...', ...this.range(start, this.tal)]
- } else {
- return [
- ...this.range(1, left),
- '...',
- ...this.range(right, this.tal),
- ]
- }
- },
- },
- data() {
- return {
- nowIndex: 1,
- maxButtons: 0,
- };
- },
- mounted() {
- let t = this;
- this.$Querey('.tm-pagination').then(res => {
- let w = res[0].width;
- t.maxButtons = Math.floor((w - uni.upx2px(20)) / uni.upx2px(64))
- })
- },
- methods: {
- clicPages(index) {
- if (index == '...') return;
- this.$emit('input', index)
- this.$emit('update:page', index)
- this.$emit('prev')
- this.$emit('change',index)
- },
- tv_pre() {
- this.$emit('input', this.page - 1)
- this.$emit('update:page', this.page - 1)
- this.$emit('prev')
- this.$emit('change',this.page - 1)
-
- },
- tv_next() {
- this.$emit('input', this.page + 1)
- this.$emit('update:page', this.page + 1)
- this.$emit('next')
- this.$emit('change',this.page + 1)
-
- },
- range(from = 1, to) {
- const range = []
- from = from > 0 ? from : 1
- for (let i = from; i <= to; i++) {
- range.push(i)
- }
- return range
- },
- init() {
- this.nowIndex = null;
- uni.$tm.sleep(100).then(() => (this.nowIndex = this.page))
- },
- },
- }
- </script>
- <style lang="scss">
- </style>
|