首页 > 其他分享 >前端分页和搜索

前端分页和搜索

时间:2023-08-04 15:48:37浏览次数:30  
标签:分页 val default 前端 搜索 duration total type

需求

一般来说,分页和搜索都是后端处理的。但有时候后端没处理,就只能前端处理了。当然这要在数据量不大的情况下,否则会性能消耗很大。

分析

  1. 使用 setTimeout(() => {}, 1000) 模拟接口调用;
  2. 数据总条数 total 是符合搜索结果的数据总条数;
  3. 使用分页组件,搭配 arr.slice() 返回当前页的数据;当前页的数据要满足两个条件:既符合搜索结果,也要满足分页要求。

因此,思路是:获取全部数据 --> 获取符合搜索结果的数据,并得到 total --> 获取满足分页要求的数据(即当前页的数据)

代码

加载当前页的数据
	// this.dataList 是全部数据
    loadCurPageData() {
      this.dataLoading = true;
      // 模拟调用接口
      setTimeout(() => {
          const { pageNum, pageSize, id } = this.queryParams;
		  // 使 allData 符合搜索结果:若是字符搜索,一般使用模糊搜索
          const allData = this.dataList.filter((e) => (id ? e.classId === id : true));
          this.total = allCons.length;
		  // 使 curPageData 满足分页要求
          this.curPageData = allCons.slice(
            pageSize * (pageNum - 1),
            pageSize * pageNum
          );
        this.dataLoading = false;
      }, 300);
    },
分页组件的使用
        <pagination
          v-show="total > 0"
          :total="total"
          :page.sync="queryParams.pageNum"
          :limit.sync="queryParams.pageSize"
          @pagination="loadCurPageData"
        />
分页组件
<template>
  <div :class="{ hidden: hidden }" class="pagination-container">
    <el-pagination
      :background="background"
      :current-page.sync="currentPage"
      :page-size.sync="pageSize"
      :layout="layout"
      :page-sizes="pageSizes"
      :pager-count="pagerCount"
      :total="total"
      v-bind="$attrs"
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
    />
  </div>
</template>

<script>
import { scrollTo } from "@/utils/scroll-to";

export default {
  name: "Pagination",
  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];
      },
    },
    // 移动端页码按钮的数量端默认值5
    pagerCount: {
      type: Number,
      default: document.body.clientWidth < 992 ? 5 : 7,
    },
    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,
    },
  },
  data() {
    return {};
  },
  watch: {},
  computed: {
    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) {
      if (this.currentPage * val > this.total) {
        this.currentPage = 1;
      }
      this.$emit("pagination", { page: this.currentPage, limit: val });
      if (this.autoScroll) {
        scrollTo(0, 800);
      }
    },
    handleCurrentChange(val) {
      this.$emit("pagination", { page: val, limit: this.pageSize });
      if (this.autoScroll) {
        scrollTo(0, 800);
      }
    },
  },
};
</script>

<style scoped>
.pagination-container {
  background: #fff;
  padding: 32px 16px;
}
.pagination-container.hidden {
  display: none;
}
</style>

scrollTo 函数
/**
 * @param {number} to
 * @param {number} duration
 * @param {Function} callback
 */
export function scrollTo(to, duration, callback) {
  const start = position()
  const change = to - start
  const increment = 20
  let currentTime = 0
  duration = (typeof (duration) === 'undefined') ? 500 : duration
  var animateScroll = function() {
    // increment the time
    currentTime += increment
    // find the value with the quadratic in-out easing function
    var val = Math.easeInOutQuad(currentTime, start, change, duration)
    // move the document.body
    move(val)
    // do the animation unless its over
    if (currentTime < duration) {
      requestAnimFrame(animateScroll)
    } else {
      if (callback && typeof (callback) === 'function') {
        // the animation is done so lets callback
        callback()
      }
    }
  }
  animateScroll()
}

标签:分页,val,default,前端,搜索,duration,total,type
From: https://www.cnblogs.com/shayloyuki/p/17606082.html

相关文章

  • 小狐狸GPT付费源码-WEB版前端的监控代码
    今天搭建了下小狐狸的WEB版,里面有个隐藏的js代码调用外部接口可以看到下面的代码 会把当前的域名调用外部接口传递过去  ......
  • 电子书搜索网站总结
    前言网站免费付费写在后面前言总结一波最近查阅书籍用到的网站,希望能帮到大家。诸如网盘(大力盘、盘搜、如风搜基本够用了,期待度盘搜重新上线)这样的搜出来的结果比较杂,在此就不多说了,下面列举一些技术类书籍搜索网站。网站免费http://www.allitebooks.org/优点:书多,种类全,全为技术类......
  • 歌谣学前端之react三个api之一续集
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷微信公众号前端小歌谣关注公众号带你进入前端学......
  • 火山引擎DataLeap:更强数据目录搜索能力,做到一步找数
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群随着数据管理变得更加复杂,元数据的重要性呈指数级增加。 如今,DataCatalog(数据目录)被看成是元数据管理的最佳工具,而一个通用的DataCatalog平台,通常包含元数据管理,搜索,血缘,标签,术语等功......
  • 考研数据结构——每日一题[二叉搜索树与表达式树]
    3765.表达式树请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时:输出的等价中缀表达式分别为(a+b)(c(-d))和(a*b)+(-(c-d))。注意:树中至少包含一个运算符。当运算符是负号时......
  • 使用JPA实现分页和模糊查询,以及jpa分页工具类
     1、首先创建DAO层接口,实现JpaRepository和JpaSpecificationExecutor两个接口JpaRepository<SysOperLog,Integer> 泛型参数分别是:要查询的实体(Entity),实体的主键类型JpaSpecificationExecutor<SysOperLog> 泛型参数:要查的实体 @RepositorypublicinterfaceSysOperLogReposi......
  • jpa 分页工具类,把 list 转 page 的工具类
    JpaPageUtils.java工具类importjava.util.ArrayList;importjava.util.List;importjava.util.Optional;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageImpl;importorg.springframework.data.domain.PageRequest;importo......
  • 使用 Elasticsearch2.1 实现博客站内搜索
    一直以来,为了优化本博客站内搜索效果和速度,我使用bing的 site:本着不折腾就浑身不自在的原则,我最终还是使用 Elasticsearch 搭建了自己的搜索服务。Elasticsearch是一个基于Lucene构建的开源、分布式、RESTful搜索引擎,很多大公司都在用,程序员的好伙伴Github的搜索也用的......
  • 前端性能优化的利器 ——— 浅谈JavaScript中的防抖和节流
    防抖和节流函数是工作中两种常用的前端性能优化函数,今天我就来总结一下什么是防抖和节流,并详细说明一下如何在工作中应用防抖和节流函数什么是防抖和节流?在JavaScript中,防抖(debounce)和节流(throttle)是用来限制函数执行频率的两种常见技术。防抖(debounce)是指在某个时间段内......
  • 千万条据下的分页
        1.1. 背景对于开发来说,分页功能碰到的频率还是算蛮高的,基本上在每个模块中都需要都会遇到列表分页的功能。他们实现的都很快,因为基本上只要把之前的代码改改就OK了。他们的实现基本是是如下语句: SELECT*FROMgoodsWHERE......