[ element-ui ] select 开启远程搜索后, 数据量过多的交互优化

博客指出下拉列表数据过多时,用户使用不便,远程搜索可解决此问题,但首次点开下拉列表因数据过多会卡顿约2秒,推测是dom渲染所致,作者将用暴力方法解决该交互问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下拉列表的数据如果过多的话, 用户用起来会十分麻烦, 100多条的数据, 总不能让用户一直往下拉去找她要的那条, 所以远程搜索就用上了, 用户一直输入关键字, 一直匹配. 但是如果是第一次点开下拉列表, 数据过多会导致2秒钟的卡顿, 姑且是dom渲染引起的, 笔者下面就用一个比较暴力的方法来解决这个交互.

<el-select 
    v-model="form.F_ADDR_LANE"
    filterable
    remote
    :remote-method="remoteMethod"
    :disabled="!form.F_ADDR_DISTRICT"
    no-data-text="无匹配数据"
    placeholder="请选择路牌">
         <el-option 
            v-for="item in roadDataList"
            :key="item.DM"
            :label="item.MC"
            :value="item.DM"></el-option>
          <div v-if="roadDataList.length > 49"  class="search-keyword">
            <span>只显示前50条结果,请完善搜索关键字</span>
          </div>
</el-select>

...

<script>
...

export default {
    data () {
        return {
            form: {
               F_ADDR_LANE: '',
               F_ADDR_DISTRICT: ''
            },
            roadDataList: [],
            roadDataList_: []
            // 列表数据如下: [{DM: "4419000933037", MC: "主山大井头六街一横巷"}, [{DM: "4419000933038", MC: "主山大井头六街二横巷"}]
        }
    },
    create: {
        this.setDistrict()
    },
    methobs: {
        async setDistrict () {
            const data = await getAdd()
            if(data) {
                this.roadDataList_ = data.data // 先存一份完整的
                this.roadDataList = data.data.slice(0, 50) // 然后渲染到页面上的是截取前面50条的
            }
        },
        remoteMethod(query) {
          if (query !== '') {
            this.roadDataList = this.roadDataList_.filter(item => {
              return item.MC.indexOf(query) > -1
            }).slice(0, 50) // 那么用户搜索的时候, 根据完整的列表来搜, 搜到的结果同样截取前50条, 不足50条忽略即可
          } else {
            this.roadDataList = this.roadDataList_.slice(0, 50) // 关键字为空的时候又将完整的列表数据截取前50条渲染回去
          }
        }
    }
}
</script>
<style>
.search-keyword {
    text-align: center;
    padding: 3px 0;
    color: #ccc;
    font-size: 13px;
}
</style>
效果图 :

在这里插入图片描述

### Element-UI Select 下拉框使用教程 Element-UI 的 `el-select` 是一个功能强大的下拉选择组件,支持多种配置选项和事件处理机制。以下是基于提供的引用内容以及扩展的知识点来详细介绍如何使用该组件。 #### 1. 修改下拉框位置 为了调整 `el-select` 组件的下拉框显示位置,可以通过设置 `teleported="false"` 属性实现[^1]。此属性的作用是让弹出层不再被挂载至 body 上,而是直接作为当前 DOM 节点的一部分渲染。这样可以更方便地通过 CSS 控制其定位: ```html <el-select v-model="value" teleported="false"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> ``` 随后可通过 `.el-popper` 类名进一步微调样式。例如,在 SCSS 文件中嵌套定义如下规则: ```scss .el-select { .el-popper { top: calc(100% + 8px); /* 自定义偏移量 */ } } ``` #### 2. 获取选中项的其他值 当需要捕获用户所选对象中的额外字段(而非仅限于 value 或 label),可借助 `@change` 方法监听变化并返回完整的数据对象[^2]。下面是一个典型的应用场景实例: ```html <div> <span class="span-box">车牌号</span> <el-select class="el-input box" v-model="subData.plate" remote filterable placeholder="请选择" :remote-method="remoteCar" @change="getAddPlateObj"> <el-option v-for="item in carslist" :key="item.vid" :label="item.plate" :value="item.plate"> </el-option> </el-select> </div> <script> export default { data() { return { subData: { plate: '' }, carslist: [ { vid: '123', plate: '京A12345-绿', platecolor: '绿', plateno: '京A12345' }, { vid: '456', plate: '沪B98765-黄', platecolor: '黄', plateno: '沪B98765' } ] }; }, methods: { getAddPlateObj(value) { const selected = this.carslist.find(item => item.plate === value); console.log('Selected Object:', selected); }, remoteCar(query) { // 动态加载逻辑... } } }; </script> ``` 上述代码片段展示了如何利用 `@change` 处理函数提取更多关联信息。 #### 3. 添加自定义按钮到下拉列表 有时可能希望在下拉菜单底部加入操作按钮等功能性控件。这可以通过创建一个不可用 (`disabled`) 的虚拟选项,并重写对应样式的手段达成目标[^3]: ```html <el-select v-model="customValue"> <el-option v-for="(item, index) in customOptions" :key="index" :label="item.label" :value="item.value"> </el-option> <!-- 定义占位符 --> <el-option disabled value="" style="height:auto;"> <button type="button" class="add-btn">新增项目</button> </el-option> </el-select> <style scoped> .add-btn { width: 100%; border: none; background-color: #f0f0f0; color: #409eff; cursor: pointer; } .add-btn:hover { background-color: #e0e0e0; } </style> ``` 以上方式允许开发者灵活定制交互行为的同时保持界面一致性。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值