当前位置: 首页 > news >正文

Vue3+setup+el-pagination+el-select封装下拉分页及懒加载

vue2下拉分页

<template>  <div>  <el-select v-model="selected" placeholder="请选择" @visible-change="handleDropdownVisibility">  <el-option  v-for="item in options"  :key="item.value"  :label="item.label"  :value="item.value">  </el-option>  <el-option  value="more"  disabled  @click.native.prevent="showDialog = true"  style="cursor: pointer;">  更多选项...  </el-option>  </el-select>  <el-dialog  title="选择选项"  :visible.sync="showDialog"  width="30%">  <div v-for="group in paginatedOptions" :key="group.page">  <p>第 {{ group.page }} 页</p>  <el-option  v-for="item in group.items"  :key="item.value"  :label="item.label"  :value="item.value"  @click="selectOption(item.value); showDialog = false;">  </el-option>  </div>  <el-pagination  @size-change="handleSizeChange"  @current-change="handleCurrentChange"  :current-page="currentPage"  :page-sizes="[10, 20, 30, 40]"  :page-size="pageSize"  layout="total, sizes, prev, pager, next, jumper"  :total="totalItems">  </el-pagination>  </el-dialog>  </div>  
</template>  <script>  
export default {  data() {  return {  selected: null,  showDialog: false,  currentPage: 1,  pageSize: 10,  totalItems: 100, // 假设总项数为100  allOptions: [], // 这里应该包含所有选项,通过API或其他方式加载  paginatedOptions: [], // 分页后的选项  };  },  computed: {  options() {  // 这里可以返回一些初始选项,或者空数组  return [];  },  },  methods: {  handleDropdownVisibility(val) {  // 如果需要的话,可以在这里处理下拉菜单的显示逻辑  // 但对于分页,我们主要依赖点击“更多选项...”  },  showDialogOptions() {  // 根据当前页和每页数量计算分页选项  const start = (this.currentPage - 1) * this.pageSize;  const end = start + this.pageSize;  this.paginatedOptions = [  { page: this.currentPage, items: this.allOptions.slice(start, end) }  ];  // 如果需要支持多页预览,可以修改此逻辑来包含多页  },  handleSizeChange(val) {  this.pageSize = val;  this.currentPage = 1; // 当改变每页数量时,重置到第一页  this.showDialogOptions();  },  handleCurrentChange(val) {  this.currentPage = val;  this.showDialogOptions();  },  selectOption(value) {  this.selected = value;  },  // 假设在某个地方加载了所有选项  loadAllOptions() {  // 模拟从API加载数据  this.allOptions = Array.from({ length: 100 }, (_, i) => ({  value: i,  label: `选项 ${i + 1}`  }));  this.totalItems = this.allOptions.length;  },  // 在组件创建或需要时调用  mounted() {  this.loadAllOptions();  }  },  
};  
</script>

vue2下拉懒加载

<template>  <div>  <el-select v-model="selected" placeholder="请选择" ref="select">  <el-option  v-for="item in visibleOptions"  :key="item.value"  :label="item.label"  :value="item.value">  </el-option>  <el-option  disabled  @click.native.prevent="showPopover = true"  slot="prepend"  style="cursor: pointer;">  请选择...  </el-option>  </el-select>  <el-popover  placement="bottom"  width="100%"  trigger="manual"  v-model="showPopover"  popper-class="select-popover"  @before-leave="handleBeforeLeave">  <div  class="select-dropdown"  @scroll="handleScroll"  ref="dropdown">  <el-option  v-for="item in allOptions.slice(0, loadedCount)"  :key="item.value"  :label="item.label"  :value="item.value"  @click="selectOption(item.value); showPopover = false;">  </el-option>  </div>  </el-popover>  </div>  
</template>  <script>  
export default {  data() {  return {  selected: null,  showPopover: false,  allOptions: [], // 假设这里有一千条数据  visibleOptions: [], // 用于el-select的初始选项(可以留空或放几个引导选项)  loadedCount: 0, // 已加载的选项数量  pageSize: 20, // 每页加载数量  };  },  methods: {  // 假设在某个地方加载了所有选项  loadAllOptions() {  // 模拟从API加载数据  this.allOptions = Array.from({ length: 1000 }, (_, i) => ({  value: i,  label: `选项 ${i + 1}`  }));  },  handleScroll(event) {  const target = event.target;  const scrollDistance = target.scrollHeight - target.scrollTop - target.clientHeight;  if (scrollDistance < 10) { // 接近底部时加载更多  this.loadMoreOptions();  }  },  loadMoreOptions() {  const newCount = Math.min(this.loadedCount + this.pageSize, this.allOptions.length);  this.loadedCount = newCount;  },  selectOption(value) {  this.selected = value;  // 可能需要做一些额外的处理,比如关闭下拉列表  },  handleBeforeLeave() {  // 在关闭popover前可能需要的处理  },  // 在组件创建或需要时调用  mounted() {  this.loadAllOptions();  this.loadedCount = this.pageSize; // 初始加载一定数量的选项  }  }  
};  
</script>  <style>  
.select-popover .el-popover__wrap {  padding: 0;  
}  
.select-dropdown {  max-height: 300px; /* 设置最大高度以产生滚动 */  overflow-y: auto;  
}  
</style>

vue3下拉分页

<template><div><!-- 下拉列表 --><el-select v-model="selectedValue" placeholder="请选择" @change="handleChange"><el-optionv-for="item in currentItems":key="item.value":label="item.label":value="item.value"/></el-select><!-- 分页组件 --><el-paginationv-if="totalItems > pageSize"layout="prev, pager, next":total="totalItems":page-size="pageSize":current-page="currentPage"@current-change="handlePageChange"/></div>
</template><script setup>
import { ref, computed, onMounted } from 'vue';
import { ElMessage } from 'element-plus';// 模拟 API 获取数据
const fetchData = (page, pageSize) => {return new Promise((resolve) => {setTimeout(() => {const total = 50; // 假设总数据量为 50const items = Array.from({ length: pageSize }, (_, index) => ({label: `选项 ${index + 1 + (page - 1) * pageSize}`,value: index + 1 + (page - 1) * pageSize,}));resolve({ items, total });}, 500);});
};// 设置响应式状态
const selectedValue = ref(null);
const currentPage = ref(1);
const pageSize = ref(10); // 每页显示的数量
const totalItems = ref(0);
const items = ref([]);// 当前页的项目
const currentItems = computed(() => {return items.value;
});// 获取数据
const getData = async (page) => {try {const response = await fetchData(page, pageSize.value);items.value = response.items;totalItems.value = response.total;} catch (error) {ElMessage.error('数据加载失败');}
};// 页码改变时的处理函数
const handlePageChange = (page) => {currentPage.value = page;getData(page);
};// 监听下拉列表选项变化
const handleChange = (value) => {console.log('当前选中的值:', value);
};// 初次加载数据
onMounted(() => {getData(currentPage.value);
});
</script><style scoped>
/* 添加一些简单的样式 */
</style>

vue3下拉懒加载

//@scroll="handleScroll"----el-select没有监听滚动事件需要自行添加,并且为滚动添加防抖
// let select: any = document.querySelector(".el-select-dropdown__wrap");// select.addEventListener("scroll", (event: any) => {//   console.log("滚动事件");// let timer: any = null;//  if (timer) {//    clearTimeout(timer);//  }//  timer = setTimeout(() => {//  loadMoreData();// }, 5000);// });
<template><el-select v-model="selectedValue" placeholder="请选择" @scroll="handleScroll"><el-optionv-for="item in items":key="item.value":label="item.label":value="item.value"/><el-option v-if="loading" disabled>加载中...</el-option></el-select>
</template><script setup>
import { ref, onMounted } from 'vue';
import { ElMessage } from 'element-plus';// 模拟 API 获取数据
const fetchLazyData = (page, pageSize) => {return new Promise((resolve) => {setTimeout(() => {const total = 100; // 假设总数据量为 100const items = Array.from({ length: pageSize }, (_, index) => ({label: `选项 ${index + 1 + (page - 1) * pageSize}`,value: index + 1 + (page - 1) * pageSize,}));resolve({ items, total });}, 500);});
};// 设置响应式状态
const selectedValue = ref(null);
const items = ref([]);
const pageSize = ref(10);
const currentPage = ref(1);
const loading = ref(false);
const totalItems = ref(0);// 获取数据
const loadMoreData = async () => {if (loading.value || items.value.length >= totalItems.value) return;loading.value = true;try {const response = await fetchLazyData(currentPage.value, pageSize.value);items.value = [...items.value, ...response.items];totalItems.value = response.total;currentPage.value += 1;} catch (error) {ElMessage.error('加载失败');} finally {loading.value = false;}
};// 处理滚动懒加载
const handleScroll = (event) => {const { target } = event;if (target.scrollTop + target.clientHeight >= target.scrollHeight - 50) {loadMoreData();}
};// 初次加载数据
onMounted(() => {loadMoreData();
});
</script><style scoped>
/* 添加一些简单的样式 */
</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • git:分支管理
  • 如果java垮了其他语言社区就遭殃了,这个说法可信吗?
  • ffmpeg编译连接报错 undefined reference to `uncompress‘
  • 安全工具 | 使用Burp Suite的10个小tips
  • CANFD和CAN最主要的区别
  • 查找算法--python
  • Qt 实现自定义截图工具
  • 二维码的原理以及Java生成二维码【中间带图片】
  • 计算机网络(四) —— 简单Tcp网络程序
  • 使用 Lodash 提供的 isNil 和 omitBy 实现对象空属性的过滤
  • appium server gui详细按照步骤
  • Python世界:力扣题43大数相乘算法实践
  • MongoDB设置系统服务启动教程
  • Web3的崛起与智能合约的角色
  • 一、Kubernetes 简介及部署方法
  • 【技术性】Search知识
  • 【刷算法】从上往下打印二叉树
  • AHK 中 = 和 == 等比较运算符的用法
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Android优雅地处理按钮重复点击
  • JavaScript 基本功--面试宝典
  • JavaWeb(学习笔记二)
  • Java深入 - 深入理解Java集合
  • Koa2 之文件上传下载
  • PHP 7 修改了什么呢 -- 2
  • python学习笔记-类对象的信息
  • scala基础语法(二)
  • v-if和v-for连用出现的问题
  • Wamp集成环境 添加PHP的新版本
  • 从重复到重用
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端临床手札——文件上传
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用common-codec进行md5加密
  • 数据结构java版之冒泡排序及优化
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序开发问题汇总
  • 物联网链路协议
  • 新手搭建网站的主要流程
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 如何在招聘中考核.NET架构师
  • #mysql 8.0 踩坑日记
  • $.each()与$(selector).each()
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (第30天)二叉树阶段总结
  • (二)PySpark3:SparkSQL编程
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (六)vue-router+UI组件库
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)项目管理杂谈-我所期望的新人