JavaScript vue + element 前端分页方法

element 分页组件(不分页)

<template>
    <el-pagination
        :current-page.sync="currentPage"
        :page-size.sync="pageSize"
        :layout="layout"
        :page-sizes="pageSizes"
        :total="total"
        :popper-class="poperClassString"
        v-bind="$attrs"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        @prev-click="handlePrevClick"
        @next-click="handleNextClick"
    />
</template>

<script>
export default {
    name: 'CePagination',
    data() {
        return {
            currentValue: this.value,
        };
    },
    props: {
        total: {
            required: true,
            type: Number,
        },
        page: {
            type: Number,
            default: 1,
        },
        limit: {
            type: Number,
            default: 20,
        },
        pageSizes: {
            type: Array,
            default() {
                return [10, 20, 30, 50];
            },
        },
        layout: {
            type: String,
            default: 'total, sizes, prev, pager, next, jumper',
        },
        background: {
            type: Boolean,
            default: true,
        },
        autoScroll: {
            type: Boolean,
            default: true,
        },
        hidden: {
            type: Boolean,
            default: false,
        },
    },
    computed: {
        poperClassString: function () {
            return 'ceis-pagination-popper';
        },
        currentPage: {
            get() {
                return this.page;
            },
            set(val) {
                this.$emit('update:page', val);
            },
        },
        pageSize: {
            get() {
                return this.limit;
            },
            set(val) {
                this.$emit('update:limit', val);
            },
        },
    },
    methods: {
        handleSizeChange(val) {
            this.$emit('change', {page: this.currentPage, limit: val});
        },
        handleCurrentChange(val) {
            this.$emit('change', {page: val, limit: this.pageSize});
        },
        handlePrevClick(val) {
            this.$emit('prev-click', {page: val, limit: this.pageSize});
        },
        handleNextClick(val) {
            this.$emit('next-click', {page: val, limit: this.pageSize});
        },
    },
};
</script>
<style lang="scss">
</style>

分页方法组件

<template>
    <ce-pagination
        :limit="pageSize"
        :total="totalCount"
        :page="page"
        @change="paginationChange"
    />
</template>

<script>
import CePagination from '@/components/CePagination';

export default {
    name: 'CePaginationFe',
    components: {
        CePagination,
    },
    data() {
        return {
            page: 1,
            pageSize: 10,
            totalCount: 10,
            tableData: [],
        };
    },
    mounted() {},
    watch: {
        tableData(nVal, oVal) {
            console.log(nVal);
            if (nVal) {
                this.paginationChange();
            }
        },
    },
    methods: {
        init(data) {
            this.tableData = data;
        },
        paginationChange(value) {
            if (value) {
                this.page = value.page;
                this.pageSize = value.limit;
                console.log(value);
            }
            this.totalCount = this.tableData.length;
            let pageStart = this.page; // 截取的开始索引
            if (this.page !== 1) {
                pageStart = (this.page - 1) * this.pageSize; // 比如点击是2,并且pageSize是10的时候 那么数据下标是 10开始就是10
                console.log(pageStart, 'if');
            }
            else {
                pageStart = 0;
            }
            let number = this.tableData.length;
            // 当点击2的时候如果第二页是最后一页进入else全部展示
            let tableDataView = [];
            if (number > pageStart + this.pageSize) {
                tableDataView = this.tableData.slice(pageStart, pageStart + this.pageSize);
            }
            else {
                tableDataView = this.tableData.slice(pageStart, this.tableData.length);
            }
            if (tableDataView.length <= 0) {
                this.page = 1;
                this.pageSize = 10;
                tableDataView = this.tableData.slice(0, 10);
            }
            this.$emit('pageViewData', tableDataView);
        },

    },
};
</script>

<style lang="scss" scoped>
</style>

 父组件 调用 分页组件的 方法

<template>
    <div>
        <table
           :data="tableData"
           border
           style="width: 100%"
           size="small"
           @selection-change="handleSelectionChange"
        >
            <el-table-column
                 v-for="item in model.itemColumn"             
                 :key="item.assetCode"
                 :prop="item.prop"
                 :label="item.label"
                 :min-width="item.width"
            />
        </table>
        <div v-show="tableData && tableData.length !== 0" >
              <ce-pagination-fe
                ref="cePaginationFe"
                @pageViewData="paginationChange"
               />
         </div>
    </div>
</template>

<script>
import CePaginationFe from '@/components/CePaginationFe';

export default {
    name: '',
    data() {
        return {
            tableData: [], // 分页后的数据
            tableView: [{
    assetCode: '600734',
    assetName: '蒸羊羔儿',
    createTime: '',
    remark: '',
}, {
    assetCode: '600735',
    assetName: '蒸熊掌',
    createTime: '',
    remark: '',
}, {
    assetCode: '600736',
    assetName: '蒸鹿尾儿',
    createTime: '',
    remark: '',
}, {
    assetCode: '600737',
    assetName: '烧花鸭',
    createTime: '',
    remark: '',
}, {
    assetCode: '600738',
    assetName: '烧雏鸡',
    createTime: '',
    remark: '',
}, {
    assetCode: '600739',
    assetName: '烧子鹅',
    createTime: '',
    remark: '',
}, {
    assetCode: '600740',
    assetName: '炉猪',
    createTime: '',
    remark: '',
}, {
    assetCode: '600741',
    assetName: '炉鸭',
    createTime: '',
    remark: '',
}, {
    assetCode: '600742',
    assetName: '炉猪',
    createTime: '',
    remark: '',
}, {
    assetCode: '600743',
    assetName: '酱鸡',
    createTime: '',
    remark: '',
}, {
    assetCode: '600744',
    assetName: '腊肉',
    createTime: '',
    remark: '',
}, {
    assetCode: '600745',
    assetName: '松花小肚儿',
    createTime: '',
    remark: '',
}, {
    assetCode: '600746',
    assetName: '晾肉',
    createTime: '',
    remark: '',
}, {
    assetCode: '600747',
    assetName: '香肠儿',
    createTime: '',
    remark: '',
}, {
    assetCode: '600748',
    assetName: '什锦苏盘儿',
    createTime: '',
    remark: '',
}];
        };
    },
    components: {
        CePaginationFe,
    },
    created() {
    },
    mounted() {},
    methods: {
        init() {
            this.$refs.cePaginationFe.init(this.tableView);
        },
        // fe分页列表回显
        paginationChange(data) {
            this.tableData = data;
        },
    },
};
</script>

<style lang="scss" scoped>
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值