最简单的element分页组件二次封装

我感觉是最简单的,

因为我看别人的实现,要么带sync,要么传父组件函数。

而我这个,我觉得隔离得比较好。

pagnation.vue(父组件传一个pageRequest过来,分页组件返回给父组件一个refreshPageRequest)

)

<template>
    <div>
        <div class="toolbar" style="padding:10px;">
            <el-pagination
              layout="total, prev, pager, next, jumper"
              @current-change="refreshPageRequest"
              :current-page="pageRequest.pageNum"
              :page-size="pageRequest.pageSize"
              :total="pageRequest.totalSize"
              style="float: right;">
            </el-pagination>
        </div>

    </div>
</template>

<script>
    export default {
        name: ‘Pagnation‘,
        props: {
            pageRequest: {
                type: Object,
                required: true
            }
        },
        methods: {
            refreshPageRequest: function(pageNum) {
                this.$emit(‘refreshPageRequest‘, pageNum)
            }
        }
    }
</script>

<style>
</style>

调用组件方

注意,按如下更新pageSize和totalSize,才会分页显示正常,相当于其它人提到的再次刷新。

this.$set(this.pageRequest,"pageSize", res.data.pageSize)
this.$set(this.pageRequest,"totalSize", res.data.totalSize)
<template>
    <div>
        <div class="toolbar" style="float:left;">
            <el-form :inline="true" :model="Filters" :size="size">
                <el-form-item>
                    <el-input v-model="Filters.label" placeholder="Pod名称"></el-input>
                </el-form-item>
                <el-form-item>
                    <kt-button icon="fa fa-search" :label="$t(‘action.search‘)" type="primary" @click="listPod(null)"/>
                </el-form-item>
            </el-form>
        </div>
        <el-table
          :data="pageResult.content"
          :highlight-current-row="highlightCurrentRow"
          v-loading="loading"
          :element-loading-text="$t(‘action.loading‘)"
          :border="border"
          :stripe="stripe"
          :show-overflow-tooltip="showOverflowTooltip"
          :max-height="maxHeight"
          :size="size"
          :align="align"
          style="width:100%;">
            <el-table-column
              v-for="column in podColumns"
              header-align="center"
              align="center"
              :prop="column.prop"
              :label="column.label"
              :width="column.width"
              :min-width="column.minWidth"
              :fixed="column.fixed"
              :key="column.pro"
              :type="column.type"
              :formatter="column.formatter"
              :sortable="column.sortable==null?true:column.sortable">
            </el-table-column>
            <el-table-column
              :lable="$t(‘action.operation‘)"
              width="185"
              fixed="right"
              header-align="center"
              align="center">
                <template slot-scope="scope">
                    <kt-button
                      :label="$t(‘action.terminal‘)"
                      :size="size"
                      type="primary"
                      @click="handleEnter(scope.row)" />
                </template>
            </el-table-column>
        </el-table>
        <pagnation :pageRequest="pageRequest" @refreshPageRequest="refreshPageRequest" />
    </div>
</template>

<script>
    import KtButton from ‘@/views/core/KtButton‘
    import Pagnation from ‘@/components/Pagnation‘
    export default {
        name: ‘KtTable‘,
        components: {
            KtButton,
            Pagnation
        },
        data() {
            return {
                size: ‘small‘,
                loading: false,
                Filters: {
                    label: ‘‘
                },
                pageshow: false,
                podColumns: [
                    {prop:"id", label:"ID", minWidth:50},
                    {prop:"nameSpace", label:"NameSpace", minWidth:120},
                    {prop:"service", label:"Service", minWidth:120},
                    {prop:"deploy", label:"Deploy", minWidth:120},
                    {prop:"label", label:"Pod", minWidth:120},
                    {prop:"createTime", label:"创建时间", minWidth:120, formatter:this.dateFormat}
                ],

                pageRequest: { pageNum: 1},
                pageResult: {},
                align: ‘left‘,
                maxHeight: 420,
                showOperation: true,
                border: false,
                stripe: true,
                highlightCurrentRow: true,
                showOverflowTooltip: true
            }
        },
        methods: {
            listPod: function (data) {
                // 在获取到数据之前,显示加载中状态
                this.loading = true
                // 如果是查询数据,则传递给listApp的是null,这个时机,可以获取查询的参数,并重新请求第1页。
                // 否则, 参数为分页的对象
                if (data === null) {
                    this.pageRequest.pageNum = 1
                    this.pageRequest.params = [{name:‘label‘, value:this.Filters.label}]
                } else {
                    this.pageRequest = data
                }

                // 前端只需要初始化一个pageNum, 其它分页数据由后端获取
                this.$api.pod.listPod(this.pageRequest).then((res) => {
                    this.pageResult = res.data
                    this.$set(this.pageRequest,"pageSize", res.data.pageSize)
                    this.$set(this.pageRequest,"totalSize", res.data.totalSize)
                })

                // 在获取到数据之后,取消加截中的状态
                this.loading = false
            },

            refreshPageRequest: function(pageNum) {
                this.pageRequest.pageNum = pageNum
                this.listPod(this.pageRequest)
            },
            handleEnter: function(row) {
                this.$emit(‘handleEnter‘, {row:row})
            }
        },
        mounted() {
            this.listPod(this.pageRequest)
        }
    }
</script>

这样一来,同一个网页,多个分页都不干扰。

原文地址:https://www.cnblogs.com/aguncn/p/12355303.html

时间: 2024-10-07 14:29:16

最简单的element分页组件二次封装的相关文章

vue-cli3 element 分页组件el-pagination的基本使用

<!--分页组件--> <el-pagination :total="total" :current-page="currentPage" :page-size="pageSize" :page-sizes="[10, 20, 30, 50]" :pager-count="5" @current-change="handleCurrentChange" @size-ch

Sprinboot中使用JPA及简单的原生分页组件

一.POM.xml文件配置   <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <

基于Vue.js的表格分页组件

BootPage组件简介 其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件库里分页组件都功能太强大或者没有适合我的,所以就自己写了一个凑合着用,或许有人和我一样需要这样一个简单的分页组件来实现简单的分页功能,我便在这里分享一下,大家自觉填坑咯. 如需高大上的组件,可以移步Vue官方组件库:https://github.com/vuejs/awesome-vue#libraries--plugins BootPage是一款支

Vue.js的表格分页组件

转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋可以移步我的上一篇文章<浅谈Vue.js>了解一下. BootPage组件简介 其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件

JQuery 常用积累(二)Pagination 分页组件

官方Demo网址:http://mricle.com/JqueryPagination 分页组件几乎是一般网站都会涉及到的组件,网上有很多这样的插件,自己挑来跳去选择了这一款,功能强大,可扩展性比较强,而且幕后的工程师一直在完善这个插件,不废话了,上干货. (模拟场景:商店网站,俺要根据用户选择的查询条件,来查询数据库,并展示到前台) 1.JSP页面: 如果你的web项目前台是基于bootstrap,js只需要引入2个js: <r:script path="/style/js/Jquery

asp.net mvc4+mysql做一个简单分页组件(部分视图)

在开始做mysql分页功能组件前,便设定的是要有一定可复用性.先在项目里Views文件夹下右键新建名为_PaginationComponent.cshtml,这里html及css我采用的bootstrap分页组件,这可以参考http://v3.bootcss.com/components/. 先将生成项目效果截图呈上: 这里有需要预先知道的,是mysql分页查询与mssql分页查询实现不同点在于,mysql支持limit语句,limit格式为 limit pageIndex*pageSize,p

java分页组件简单设计(贼简单)

代码很简单,关键是思想. 每个业务模块基本都会涉及到分页的应用,不管是普通的分页浏览还是瀑布流形式的浏览.分页可以减轻服务器的压力,可以节俭页面布局.在我们的分页简单组件设计中,主要是需要返回给客户端四个数据:列表对象.当前页码.每页记录最大条数.记录总数. 列表对象:顾名思义,就是展示给用户看的当前页面记录: 当前页码:主要是需要js来高亮: 每页记录最大条数:一般是服务器设定 记录总数:js用来计算总页数使用 设计思想: 1.由于分页是一种可以公共使用的功能,所以可以开发成一个组件,这样可以

Element UI分页组件prev-text和mext-text属性无效?

前情提要 /(ㄒoㄒ)/~~ 作为刚刚接触 Element 组件的人来说,看文档是第一步,但是当我想要修改分页组件里面的按钮时却遇到了问题. 文档中写到是需要给 prev-text 和 next-text 属性就可以将下图中划红线的小箭头修改成想要的文字,比如“上一页”和“下一页”. 于是我试了两种方式去使用这两个属性,都没有成功,分页组件“一动不动”,简直就是黑人问号脸! //第一种方法无效 <div class="block"> <el-pagination la

vue+element UI实现分页组件

1.前言 在web页面中,常常需要将后台查询到的数据以表格形式展示出来,而这些数据量往往会非常庞大,如果将所有要展示的数据一次性请求获取并展示到页面上,那页面长度势必会变得非常的长,很不美观.更重要的是,如果数据量过于大,在页面加载时一次性请求全部数据将会耗费大量网络资源,性能极低.但是,如果我们可以将数据分页展示,这样页面首先不会变的冗长,另外只有用户点击页码才会发出请求并且每次请求的数据量也不会很大,这就极大的节省了网络资源,提高了性能.本文就以vue结合element UI实现一个数据分页