# zylRemoteSelect - 远程搜索分页选择器组件

# 用途

可用于优化 el-select 组件远程搜索无法分页加载的缺陷,降低服务器查询压力。

# 基础用法

滚动至底部查看分页加载效果

使用 initList 属性初始化数据实现数据回填

(1)单选:2400

(2)多选:[ 1000, 2400, 300 ]

您也可以自定义备选项

复制代码
<template>
  <div>
    <p>滚动至底部查看分页加载效果</p>
    <zyl-remote-select
      v-model="form.userId"
      :pageSize="10"
      :total="userListTotal"
      clearable
      placeholder="请搜索并选择用户"
      showDefaultList
      @getSelectList="getSelectList"
    />
    <p>使用 <strong>initList</strong> 属性初始化数据实现数据回填</p>
    <p>(1)单选:{{ form2.userId }}</p>
    <zyl-remote-select
      v-model="form2.userId"
      :initList="form2.initList"
      :pageSize="10"
      :total="userListTotal"
      clearable
      placeholder="请搜索并选择用户"
      showDefaultList
      @getSelectList="getSelectList"
    />
    <p>(2)多选:{{ form3.userId }}</p>
    <zyl-remote-select
      v-model="form3.userId"
      :initList="form3.initList"
      :pageSize="10"
      :total="userListTotal"
      clearable
      multiple
      reserve-keyword
      showDefaultList
      placeholder="请搜索并选择用户"
      @getSelectList="getSelectList"
    />
    <p>您也可以自定义备选项</p>
    <zyl-remote-select
      v-model="form4.userId"
      :pageSize="10"
      :total="userListTotal"
      clearable
      placeholder="请搜索并选择用户"
      showDefaultList
      @getSelectList="getSelectList"
    >
      <template v-slot:optionItem="{ row, $index }">
        <span style="color:blue">序号 {{ $index }}:</span>
        <span style="color:red">{{ row.label }}</span>
      </template>
    </zyl-remote-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      userListTotal: 0,
      form: {
        userId: ''
      },
      form2: {
        userId: 2400,
        initList: [{ label: '张三丰(ID:2400)', value: 2400 }]
      },
      form3: {
        userId: [1000, 2400, 300],
        initList: [
          { label: '二麻子(ID:1000)', value: 1000 },
          { label: '张三丰(ID:2400)', value: 2400 },
          { label: '李四(ID:300)', value: 300 }
        ]
      },
      form4: {
        userId: ''
      },
      // 模拟数据库数据
      dataBase: [
        { userName: '王源', userId: 100 },
        { userName: '张三', userId: 200 },
        { userName: '李四', userId: 300 },
        { userName: '王五', userId: 400 },
        { userName: '张丽', userId: 500 },
        { userName: '王媛媛', userId: 600 },
        { userName: '王志强', userId: 700 },
        { userName: '李晓明', userId: 800 },
        { userName: '钱学森', userId: 900 },
        { userName: '二麻子', userId: 1000 },
        { userName: '张三丰', userId: 1100 },
        { userName: '钱学森', userId: 1200 },
        { userName: '二麻子', userId: 1300 },
        { userName: '张三丰', userId: 1400 },
        { userName: '张三丰', userId: 1500 },
        { userName: '张三丰', userId: 1600 },
        { userName: '张三丰', userId: 1700 },
        { userName: '张三丰', userId: 1800 },
        { userName: '张三丰', userId: 1900 },
        { userName: '张三丰', userId: 2000 },
        { userName: '张三丰', userId: 2100 },
        { userName: '张三丰', userId: 2200 },
        { userName: '张三丰', userId: 2300 },
        { userName: '张三丰', userId: 2400 }
      ]
    }
  },
  methods: {
    getSelectList(searchWorld, pageNum, pageSize) {
      // 需要返回一个promise
      return new Promise((resovle) => {
        // 模拟请求
        setTimeout(() => {
          // 模拟后端响应数据模糊搜索(此部分为演示数据处理)
          const filterList = searchWorld
            ? this.dataBase.filter(
                (item) => item.userName.indexOf(searchWorld) > -1
              )
            : this.dataBase

          // 模拟后端响应数据分页查询(此部分为演示数据处理)
          const m = (pageNum - 1) * pageSize
          const n = pageNum * pageSize
          const pageList = filterList.slice(m, n)

          // 模拟响应数据最终返回(此部分为演示数据处理)
          let data = {
            list: pageList,
            total: filterList.length
          }

          // 告知组件数据总数,用于判断是否下拉到底部
          this.userListTotal = data.total
          // 转换成组件接收的形式
          const list =
            data.list.map((item) => {
              return {
                label: `${item.userName}(ID:${item.userId})`, //加上id或其他唯一标识用于识别同名选项
                value: item.userId
              }
            }) || []
          // 传入组件方法列表数据
          resovle(list)
        }, 1500)
      })
    }
  }
}
</script>
显示代码

该组件新增和替换的属性/事件/方法在以下表格,除远程搜索必要的参数filterableremoteloadingremote-method 被占用外,其余参数全部继承自 el-select (opens new window) ,可自行查阅按照原方法使用。

# 属性

# 事件

# 方法

请在该组件绑定 ref 后通过 this.$refs.组件绑定ref的名称.$refs.remoteSelect.方法名() 进行 el-select 方法的使用。

上次更新: 1/6/2025, 9:59:46 AM