Elementui 分页查询的实现

Elementui 分页查询的实现

  1. 首先确定,数据库分页查询代码(以MySql数据库为例)

    SELECT * FROM user LIMIT #{beginNum},#{everyPage}
    beginNum:从哪个值开始,一般数据库表第一个值的位置序号为0,从0开始往下查
    everyPage:每页多少个数据
    
  2. 所以我们确定了,数据库需要的两个数据。我们从前端往后面传值的时候,往往选择传送的两个值是(1)当前页数(pageCode),(2)每页的数据总量(pageSize),所以我们需要计算一下数据库需要的数据。

    		int beginNum = 0;     /*因为传来的当前页可能为0,所以要判断一下*/
            if (nowPage != 0){
                beginNum = (nowPage - 1) * pageSize;
            }
    
  3. 现在可以编写后端代码了,因为我还做了一个查询数据总量,不需要的同学可以不用做。且我用的是IDEA做的springboot项目,我直接放代码了(不太重要的就不放了)。

    1. 先编写 mapper 文件以及 mapper.xml 文件
    mapper文件:
    /**
         * 查询user表总记录数
         * @return
         */
        int selectUserCounts();
    
        /**
         * 分页查询用户
         * @param map
         * @return
         */
        List<User> selectUserList(Map<String,Object> map);
    
    
    mapper.xml文件
        <!--查询user表总记录数-->
      <select id="selectUserCounts" resultType="int">
        select count(*) from user
      </select>
      <!--分页查询用户-->
        <select id="selectUserList" parameterType="map" resultMap="BaseResultMap">
        SELECT * FROM user LIMIT #{beginNum},#{everyPage}
      </select>
    
    1. 编写service 文件
    @Service
    public class UserServices {
        @Autowired
        private UserMapper userMapper;
        /**
         * 分页查询用户
         * @param nowPage 当前第几页
         * @param pageSize  每页多少数据
         * @return
         */
        public Map<String,Object> queryUserList(int nowPage,int pageSize){
            /*查询总记录数*/
            int totalRecord = userMapper.selectUserCounts();
            int beginNum = 0;
            if (nowPage != 0){
                beginNum = (nowPage - 1) * pageSize;
            }
            Map<String,Object> queryMap = new HashMap<>();
            queryMap.put("beginNum",beginNum);
            queryMap.put("everyPage",pageSize);
    
            List<User> queryUserList = userMapper.selectUserList(queryMap);
            Map<String,Object> outMap = new HashMap<>();
            outMap.put("total",totalRecord);
            outMap.put("list",queryUserList);
            return  outMap;
        }
    }
    
    
    1. 编写controller文件

      @RestController    /* 使返回的数据转为 json 格式的数据 */
      @RequestMapping("/user")
      public class UserinfoController {
          @Autowired
          private UserServices userServices;
          /**
           * 分页查询用户
           * @param queryMap
           * @return
           */
          @RequestMapping("/queryUserListt")
          public Map<String,Object> queryUserList(@RequestBody Map<String,Object> queryMap){
              int nowPage = Integer.parseInt(queryMap.get("pageCode").toString());
              int pageSize = Integer.parseInt(queryMap.get("pageSize").toString());
              return userServices.queryUserList(nowPage,pageSize);
          }
      }
      
      
  4. 现在再来看前端代码,注意:我的分页已经做了封装了,封装成组件了,不过大意还是一样的

    1. 现将组件导入,注册
    <script>
        import Paginate from '~/components/Pagination/Paginate.vue'; /*导入,注意不啊哟丢了分号 ;  */
        export default {
            components: {
            Paginate          /*注册组件,局部注册*/
            },
        }
    </script>
    
    1. 在table下,放下该组件
      <el-table :data="userList" border ref="table" style="width: 100%">
         <!-- 此处改为你的table表格,我为了简单明了直接省略了-->      
      </el-table>
            <Paginate                <!-- 这就是那个分页组件-->    
                    api="queryUserList"    <!-- 接口路径--> 
                    :params="params"        <!--往后端传送的主体--> 
                    :refresh="refresh"               <!--用于搜索--> 
                    @val-change="changeUserList">      <!--自定义方法使得得到userlist-->
            </Paginate>
    
    1. 现在我要放我的完整的 html代码了
    <template>
        <div class="user-list">
            <ToolBar>
                <!--  <el-button type="primary" icon="el-icon-plus" size="small" @click="editUser(false)">添加</el-button>-->
                <div style="float: right">
                    <el-input
                            placeholder="请输入用户昵称!"
                            size="small"
                            style="width: 140px"
                            v-model="params.username"
    
                            clearable>
                    </el-input>
                    <el-button  type="success" icon="el-icon-search" size="small"></el-button>
                </div>
            </ToolBar>
            <el-table
                    :data="userList"
                    border
                    ref="table"
                    style="width: 100%">
                <el-table-column
                        type="index"
                        width="66"
                        label="序号">
                </el-table-column>
                <el-table-column
                        prop="id"
                        label="用户id">
                </el-table-column>
                <el-table-column
                        prop="username"
                        label="用户昵称">
                </el-table-column>
                <el-table-column
                        prop="emaill"
                        label="邮箱">
                </el-table-column>
                <el-table-column
                        prop="realname"
                        label="真实姓名">
                </el-table-column>
                <el-table-column
                        prop="sex"
                        width="66"
                        label="性别">
                   <!-- <div slot-scope="scope" style="width: 100%;text-align: center">{{ $Config.sex[scope.row.sex] }}</div>-->
                </el-table-column>
                <el-table-column
                        prop="state"
                        label="状态">
                </el-table-column>
                <el-table-column
                        prop="status"
                        label="用户类型">
                </el-table-column>
                <el-table-column
                        label="操作"
                        width="180">
                    <template slot-scope="scope">
                        <el-button @click="resetting(scope.row.id)" type="warning" style="transition: .4s;"  :ref="scope.row.id"  icon="el-icon-refresh" size="small" circle></el-button>
                        <el-button @click="editUser(scope.row)" type="primary" icon="el-icon-edit" size="small" circle></el-button>
                        <el-button @click="deleteUser(scope.row.id)"  type="danger" icon="el-icon-delete" circle size="small"></el-button>
                        <!--<el-button @click="deleteUser(scope.row.id)" v-else icon="el-icon-check" circle size="small"></el-button>-->
                    </template>
                </el-table-column>
            </el-table>
            <Paginate
                    api="queryUserList"
                    :params="params"
                    :refresh="refresh"
                    @val-change="changeUserList">      <!--自定义方法使得得到userlist-->
            </Paginate>
    
        </div>
    </template>
    
    <script>
        import ToolBar from '~/components/ToolBar/ToolBar.vue';
        import HelpHint from '~/components/HelpHint/HelpHint.vue';
        import Paginate from '~/components/Pagination/Paginate.vue';
    
        export default {
            data() {
                return {
                    params: {
                        username: '',
                    },
                    refresh: true,
                    userList: [
                        {id:1,username:'Admin',emaill:'1@qq.com',realname:'张三',sex:'男',state:'正常',status:'超级管理员'}
                    ]
                }
            },
            components: {
                ToolBar, HelpHint,Paginate
            },
            methods: {
                changeUserList(userList){
                    this.userList = userList;
                }
            }
        }
    </script>
    <style lang="less">
    
    </style>
    
    
    1. 这是我的分页组件
    <!--
    如何使用?
    1.导入并添加components, import ToolBar from '~/components/ToolBar/ToolBar.vue',
    2.绑定你的api、参数和数据处理函数,会自动生成分页
    <Paginate
        api="postList"         提供接口
        :params="params"       实现按需跳转,与后端传值
        :refresh="refresh"      用于搜索
        @val-change="PaginateData"   自定义事件,
        >
    </Paginate>
    3.当你再次改动参数时,执行 refresh=!refresh 即可刷新。用于搜索。
    
    -->
    
    <template>
      <div class="pagination">
        <div class="total">本页共有{{currentDataLength}}条数据</div>
        <!--
        1.@size-change:作用,当每页的数据量变化时,该事件被触发,即:pageSize 改变时
        2.layout="total, sizes, prev, pager, next, jumper":作用,total,意思是显示数据总量;sizes:显示当前页数据量的最大值;
        prev:向前翻页的图标;pager:当前页;next:向后翻页的图标;jumper:跳转到那页
        3.:page-sizes :作用,给定几个每页多少数据
        4. :page-size : 作用,确定当前页数据量初始值
        5. @current-change:作用,当前页数的改变会被触发,即 currentPage 改变时会触发,
        6. :total:作用,确定数据总量
        -->
        <el-pagination
                @size-change="handleSizeChange"
                layout="total, sizes, prev, pager, next, jumper"
                :page-sizes="pageSizes"
                :page-size="pageSize"
                @current-change="change"
                :total="total">
        </el-pagination>
      </div>
    </template>
    <script>
      export default {
        name: 'Paginate',
        props: {                   /*用来接收父组件的返回的数据*/
          api: String,
          params: Object,
          refresh: Boolean,
        },
        data() {
          return {
            total: 0,                      /*总共多少数据*/
            current: 0,                   /*从第几页开始*/
            currentDataLength: 0,         /*当前页有多少数据*/
            pageSize: 5 ,                 /* 每页多少数据 */
            pageSizes:[5, 10, 15, 20]
          }
        },
        methods: {
          handleSizeChange(val) {
            console.log(`每页 ${val} 条`);
            this.pageSize = val;        /*当前页数据量变动时,绑定给pageSize,实现实时的更新表格*/
            this.paginate();
          },
          paginate: function () {
            let thisApp = this;
            let params = thisApp.params;
            params.pageSize = thisApp.pageSize
            params.pageCode = thisApp.current;
    
            thisApp.$Api[thisApp.api](params, function (data) {
              thisApp.total = data.total;                               /*接收从后端返回的总记录数*/
              thisApp.currentDataLength = (data.list).length          /*接收从后端返回的数据的长度*/
              thisApp.$emit('val-change', data.list);               /*使用 $emit 触发父组件的自定义事件,将从后端返回的用户数据布置到前端*/
            })
          },
          change: function (page) {    /*改变页数,实现分页*/
            this.current = page;
            this.paginate();
          }
        },
        mounted: function () { /*页面加载的时候运行*/
          this.paginate();
        },
        watch: {        /*监听功能*/
          'refresh': {
            handler: function () {
              this.current = 0;
              this.paginate();
            },
            // 深度观察
            deep: true
          }
        },
    
      }
    </script>
    <style lang="less" scoped>
      .pagination {
        padding: 7px;
        border: 1px solid #ebeef5;
        background: #fff;
        text-align: right;
      }
      .total {
        float: left;
        margin-top: 8px;
        margin-left: 10px;
        font-size: 13px;
        color: #606266;
      }
    </style>
    
  5. 大功告成!!!

  6. 小小收藏,elementui中,分页的参数与事件小结

    1.@size-change:作用,当每页的数据量变化时,该事件被触发,即:pageSize 改变时
    2.layout="total, sizes, prev, pager, next, jumper":作用,total,意思是显示数据总  量;sizes:显示当前页数据量的最大值;
    prev:向前翻页的图标;pager:当前页;next:向后翻页的图标;jumper:跳转到那页
    3.:page-sizes :作用,给定几个每页多少数据
    4. :page-size : 作用,确定当前页数据量初始值
    5. @current-change:作用,当前页数的改变会被触发,即 currentPage 改变时会触发,
    6. :total:作用,确定数据总量
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值