基于elementUi的分页选择器(el-select在数据量过多时不好用)

背景

        基于项目开发,有一个form表单用到很多接口进行选择,测试环境数据量不大,就一次性查询了,正式环境上线后好几个接口数据量在万级别导致内存溢出,且页面卡顿,后想办法解决。首先尝试用el-select里面嵌套分页,试了好几次,包括分页、远程搜索等,出现一个问题解决一个问题,但问题源源不断,后改用此方法,进行弹窗选择。

这样的好处也是,打开弹窗时才请求接口获取数据,并不会在打开表单的时候全部请求,导致数据过多内存溢出。

效果图

组件代码

<!--选择器-->
 <el-select    
           v-model="data"
           clearable
           placeholder="请选择"
           value-key="shipNo"
           @change="selectShip"
           @click.native="clickShipForm">
</el-select>

<!--选择弹窗-->
<el-dialog :visible.sync="selectShipDialog.dialogVisible" class="dialogClass" @close="closeShipDialog"
                   :close-on-click-modal="false">
	<div v-loading="selectShipDialog.loadingData" class="shipDialogContent">
		<div slot="title" class="dialog-title">
			<section>
				<h1 class="dialogTit">弹窗选择器</h1>
			</section>
		</div>
		<!--输入模糊查询-->
		<div class="searchContent">
			<el-row :gutter="20">
				<el-col :span="6">
					<div class="grid-content bg-purple">
						<el-input v-model="selectShipDialog.shipNam" placeholder="请输入船名"></el-input>
					</div>
				</el-col>
				<el-col :span="2.5">
					<div class="grid-content bg-purple">
						<el-button type="primary" @click="fuzzyQueryShip" icon="el-icon-search">查询</el-button>
					</div>
				</el-col>
				<el-col :span="3">
					<div class="grid-content bg-purple">
						<el-button @click="resetFuzzyQuery" icon="el-icon-refresh">重置</el-button>
					</div>
				</el-col>
			</el-row>
		</div>
		<el-table :data="shipList" height="480" @cell-dblclick="shipInfoDbClick">
			<el-table-column property="shipStatNam" label="状态" width="100"></el-table-column>
			<el-table-column property="shipNam" label="姓名" width="200"></el-table-column>
			<el-table-column property="shipNo" label="年龄" width="100"></el-table-column>
			<el-table-column property="voyage" label="性别"></el-table-column>
			<el-table-column property="tradeNam" label="列名">
				<template slot-scope="scope">
					<el-tag :type="scope.row.value=== '1' ? 'primary' : 'success'" disable-transitions>
						{{ scope.row.value}}
					</el-tag>
				</template>
			</el-table-column>
		</el-table>
		<div class="dialogPagination">
			<el-pagination
				:current-page="selectShipDialog.currentPage"
				:page-size="selectShipDialog.pageSize"
				:pager-count="15"
				layout="prev, pager, next"
				:total="selectShipDialog.total"
				@current-change="changeShipPage"
				@size-change="changeShipSize">
			</el-pagination>

		</div>
	</div>
</el-dialog>

这里有几个注意的地方:

  1. el-select不要使用filterable或其他用不到的属性,或导致点击的时候出现一个空的弹框;
  2. el-select的change事件主要用于点叉清空时对数据更改;

CSS样式

/*弹窗的border弧度*/
.dialogClass >>> .el-dialog {
    border-radius: 15px;
}

/*弹窗头部标题的高度*/
.dialogClass >>> .el-dialog__header {
    padding: 0 20px 10px;
}

/*自定义头部的高度调整后关闭弹窗的叉会被覆盖*/
.dialogClass >>> .el-dialog__headerbtn {
    z-index: 10;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用的是 Element UI 中的 el-select 组件,并且需要在下拉选项中显示大数据并进行分页处理,您可以使用以下步骤来实现: 1. 将数据分页处理:将所有数据分为若干页,每页显示固定数的选项。您可以使用 JavaScript 中的 Array.slice() 方法来实现这个功能。 2. 根据当前页数,过滤出要显示的选项数据。 3. 将过滤后的数据渲染到 el-select 组件的下拉选项中。 这里提供一个简单的示例代码: ```html <el-select v-model="selected" @visible-change="handleVisibleChange"> <el-option v-for="item in filteredOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> <el-option v-if="options.length === 0" :label="'No Data'" :value="null"></el-option> <el-option v-if="loading" :label="'Loading...'" :value="null"></el-option> </el-select> ``` ```javascript data() { return { options: [], // 所有的选项数据 pageSize: 10, // 每页显示的数 currentPage: 1, // 当前页数 loading: false, // 是否正在加载数据 selected: null, // 当前选中的值 }; }, computed: { filteredOptions() { const startIndex = (this.currentPage - 1) * this.pageSize; const endIndex = startIndex + this.pageSize; return this.options.slice(startIndex, endIndex); }, }, methods: { async handleVisibleChange(visible) { if (visible && this.options.length === 0) { this.loading = true; // 使用异步请求获取所有的选项数据 const data = await fetchData(); this.options = data; this.loading = false; } }, }, ``` 在上述代码中,我们使用 computed 属性 filteredOptions 来过滤出要显示的选项数据,以便在 el-select 组件的下拉选项中显示。在 handleVisibleChange 方法中,我们通过异步请求来获取所有的选项数据,并将其存储在 options 数组中。在 el-select 组件中,我们使用 v-for 指令来循环渲染 filteredOptions 中的数据,实现分页显示的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值