小言_互联网的博客

利用vue模拟element-ui的分页器效果

265人阅读  评论(0)

前文提要:

本篇文章实现的是客户端发送请求需要请求

 那些数据,服务器根据请求实现分段数据发送

  比如客户端点击的是第一页,

   服务器发送全部数据的前四条

目录

自定义分页器

1. 思路

1.1客户端

1.2服务器

2.服务器

2.1创建数据

2.2创建接口

 3.客户端

3.1创建静态页面

3.2请求数据

3.3解析逻辑

4.总结


 

自定义分页器

效果展示:

 


1. 思路

1.1客户端

利用vue相关的知识搭建基本页面,

上面四张图片,下面是分页器基本

效果静态显示。点击分页器实现

不同数据请求,显示不同图片

1.2服务器

根据客户端发送的数据进行数据

分段传输,比如,点击的是那一页

分页器每次需要展示几个数据,


2.服务器

创建数据(存放图片的网址,以及id)

创建接口,发送数据。

2.1创建数据

创建一个文件夹,下载express

npm i express

在该文件先创建一个

images.json文件使用


  
  1. [
  2. {
  3. "id": 1,
  4. "imgUrl": "图片网址"
  5. },
  6. {
  7. "id": 2,
  8. "imgUrl": "图片网址"
  9. }
  10. .
  11. .
  12. .
  13. .
  14. ]

2.2创建接口

根据得到pageNo(用于显示在第几页),pageSize(一页显示多少数据)

比如在第一页,那么就是数组的第0项到第四项(pageSize)

采用切片的方法,我们可以得到一个等式及

每一项的开始值为当前页减一在乘与pageSize

start=(pageNo-1)*pageSize


  
  1. const express= require( 'express')
  2. const fs= require( 'fs')
  3. const app= express()
  4. fs. readFile( './images.json', (err,data)=>{
  5. if(err) return console. log(err)
  6. let result= JSON. parse(data)
  7. app. get( '/imgsDate', (req,res)=>{
  8. let start= 0
  9. let {pageNo,pageSize}=req. query
  10. start=(pageNo- 1)*pageSize
  11. let end= parseInt(start)+ parseInt(pageSize)
  12. //解决跨域问题
  13. res. setHeader( 'Access-Control-Allow-Origin', '*');
  14. res. setHeader( 'Access-Control-Allow-Headers', '*');
  15. console. log(start,end)
  16. //用于分段传输数据(切片方法一次传递4条数据)
  17. let data=result. slice(start,end)
  18. res. send({data, total:result. length})
  19. })
  20. })
  21. app. listen( 8000, ()=>{
  22. console. log( "开启成功")
  23. })

结果展示:


 3.客户端

需要完成的三大步

1.创建基本静态页面

2.请求数据展示

3.创建逻辑方法

 

3.1创建静态页面

home组件内包含分页器组件


  
  1. <ul >
  2. <li> <img src=""> </li>
  3. </ul>
  4. <pagetionItem/>

分页器组件


  
  1. <div class="pagination">
  2. <button >上一页 </button>
  3. <button >1 </button>
  4. <button >..... </button>
  5. <!-- 中间连续页码的地方:v-for、数组、对象、数字、字符串 -->
  6. <button> </button>
  7. <button v-if="startAndEnd.end<totalPage-1">...... </button>
  8. <button>总页数 </button>
  9. <button >下一页 </button>
  10. <button style="margin-left: 30px">共 {{}} 条 </button>
  11. </div>

3.2请求数据

根据前面的内容,我们需要两个参数pageNo,pageSize

home组件逻辑


  
  1. <template >
  2. <div>
  3. <ul v-for="img in imgs" :key="img.id">
  4. <li> <img :src="img.imgUrl"> </li>
  5. </ul>
  6. <pagetionItem
  7. :pageNo= "searchParams.pageNo"
  8. :pageSize= "searchParams.pageSize"
  9. :total= 'total'
  10. :pagerCount= '5'
  11. class= "page"
  12. @ getPages= "getPages"/>
  13. </div>
  14. </template>
  15. data( ) {
  16. return {
  17. //得到数据
  18. imgs: [],
  19. //总数
  20. total: null,
  21. //请求参数
  22. searchParams: {
  23. pageNo: 3,
  24. pageSize: 4
  25. }
  26. }
  27. },
  28. created( ) {
  29. this. img()
  30. },
  31. methods: {
  32. async img( ) {
  33. let result = await axios. get( "http://localhost:8000/imgsDate",
  34. {
  35. params: {
  36. pageNo: this. searchParams. pageNo,
  37. pageSize: this. searchParams. pageSize
  38. }
  39. })
  40. this. imgs = result. data. data
  41. this. total=result. data. total
  42. },
  43. //用于处理分页器传递的当前页数,利用全局总线得到数据
  44. getPages( pageNo){
  45. this. searchParams. pageNo=pageNo
  46. this. img()
  47. }
  48. }

分页器组件


  
  1. <template>
  2. <div class="pagination">
  3. <button :disabled="pageNo==1"
  4. @ click= "$emit('getPages',pageNo-1)">上一页 </button>
  5. <button v-if="startAndEnd.start > 1"
  6. @ click= "$emit('getPages',1)" :class= "{active:pageNo==1}">1 </button>
  7. <button v-if="startAndEnd.start > 2">..... </button>
  8. <!-- 中间连续页码的地方:v-for、数组、对象、数字、字符串 -->
  9. <button v-for="(page,index) in startAndEnd.end"
  10. :key= "index" v-if= "page >=startAndEnd.start"
  11. @ click= "$emit('getPages',page)" :class= "{active:pageNo==page}">{{page}} </button>
  12. <button v-if="startAndEnd.end<totalPage-1">...... </button>
  13. <button v-if="startAndEnd.end<totalPage"
  14. @ click= "$emit('getPages',totalPage)" :class= "{active:pageNo==total}">{{ totalPage }} </button>
  15. <button :disabled="pageNo==totalPage"
  16. @ click= "$emit('getPages',pageNo+1)">下一页 </button>
  17. <button style="margin-left: 30px">共 {{total}} 条 </button>
  18. </div>
  19. </template>
  20. <script>
  21. export default {
  22. name: "pagetionItem",
  23. props: [ "total", "pageSize", "pageNo", "pagerCount"],
  24. computed: {
  25. //分页器一共多少页【总条数/每页展示条数】
  26. totalPage( ) {
  27. //向上取整数
  28. return Math. ceil( this. total / this. pageSize);
  29. },
  30. //底下的代码是整个分页器最重要的地方[算出连续五个数字、开头、结尾]
  31. startAndEnd( ) {
  32. //算出连续页码:开始与结束这两个数字
  33. let start = 0,
  34. end = 0;
  35. const { totalPage, pagerCount, pageNo } = this;
  36. //特殊情况:总共页数小于连续页码数
  37. if (totalPage < pagerCount) {
  38. start = 1;
  39. end = totalPage;
  40. } else {
  41. //正常情况:分页器总页数大于连续页码数
  42. start = pageNo - parseInt(pagerCount / 2);
  43. end = pageNo + parseInt(pagerCount / 2);
  44. //约束start|end在合理范围之内
  45. //约束头部
  46. if (start < 1) {
  47. start = 1;
  48. end = pagerCount;
  49. }
  50. //约束尾部
  51. if (end > totalPage) {
  52. end = totalPage;
  53. start = totalPage - pagerCount + 1;
  54. }
  55. }
  56. return { start, end };
  57. },
  58. }
  59. };

3.3解析逻辑

home组件,

在组件创建时实现方法,创建方法img

发送请求,等到相应的数据,

在home组件展示

分页器

1.利用全局总线和自定义时间,

   当点击分页器的每一项时向home组件

    的getpage方法传输当前是第几页

2.分页器逻辑

     总页数=

       全部数据  / 每一页展示的数据

        (向上取整)

    下一页=

        当前页+1

        (当当前页=总页数时,禁止按钮点击事件)

     上一页=

                当前页-1(

                当当前页=1,禁止按钮点击事件)

     中间按钮显示:

        两侧都有(....)

        当数据的中间项-pizeSize

        或者+pizeSize=等于第一项或者

        等于最后一项时不显示


4.总结

1.学会了怎么根据请求参数,分段发送数据

2.学会了数据渲染与自定义事件与全局总线

3.学会了分页器的基本思想

 

 


转载:https://blog.csdn.net/m0_51311990/article/details/127601162
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场