【AntD+Vue】使用Select模糊查询(模糊查询及渲染大量数据卡顿问题):


1、简单模糊查询:

适合数据较少,接口获取全部下拉数据较快

:filterOption=“filterOption”
showSearch //点击可输入内容,搜索option对应的value的值
:allowClear=“true” //支持清空

// 下拉模糊查询
filterOption(input, option) {
  return (
    option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
  );
},
 <a-form-model-item label="货名" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="variety">
     <a-select v-model="model.variety" showSearch allowClear optionLabelProp="label" placeholder="请选择货名" style="width: 100%;" :filter-option="filterOption">
        <a-select-option v-for="item in varietyList" :key="item.id" :value="item.id" :label="item.variety">
            {{ item.variety }}
        </a-select-option>
     </a-select>
</a-form-model-item>


<script>
import { getAction,  httpAction} from '@/api/manage'

export default {
  name: 'Variety',
  data() {
    return {
      model: {},
      url: {
        variety: '/kd/variety/list', // variety-查询货名列表
      },
      varietyList: [],//货名
    }
  },
  created() {
    this.getDictList()
  },
  methods: {
  	//获取货品的全部下拉数据
    getDictList() {
      getAction(this.url.variety).then(res => {
        if (res.success) {
          this.varietyList = res.result.records || res.result.list//注意:获取到的是全部下拉数据
        } else {
          this.$message.warning(res.message);
        }
      })
    },
    // 下拉模糊查询(这里不需要修改,复制过去即可)
    filterOption(input, option) {
      return (
        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
      );
    },
  }
}
</script>
2、渲染大量数据卡顿问题:

Antd select框渲染大量数据会造成卡顿问题,点击下拉很长时间才显示

<template>
 <a-form layout="inline">
    <a-form-item label="业务">
      <a-select
        v-model="selectedVal"
        :loading="dataLoading"
        placeholder="输入搜索内容"
        style="width: 240px;"
        show-search
        option-filter-prop="children"
        @search="handleSearch"
        @popupScroll="handlePopupScroll"
        @select="handleSelect"
      >
        <a-select-option v-for="item in renderedOptions" :value="item" :key="item">
          {{ item }}
        </a-select-option>
      </a-select>
    </a-form-item>
  </a-form>
</template>
<script>
import debounce from 'lodash/debounce'
import { fetchBusinessList } from '@/api/public' // 根据实际修改
const LOAD_NUM = 30 // 加载条数--可自定义

export default {
  name: 'BaseForm',
  data () {
    return {
      selectedVal: '', // Select框选中的值
      oriDataList: [], // 原数据列表 -- 从接口获取
      dataLoading: false, // 原数据列表的加载状态 -- 接口的响应状态
      searchVal: '', // 搜索的内容
      filterDataList: [], // 过滤的数据列表 -- 从dataList中过滤出含搜索内容的数据
      renderedOptions: [] // 已渲染的下拉列表
    }
  },
  mounted () {
    this.getDataList()
  },
  methods: {
    // 获取数据源,并取数据源的前n条作为下拉列表的可选项
    getDataList () {
      this.dataLoading = true
      fetchBusinessList().then(res => {
        this.dataLoading = false
        this.oriDataList = res.result // 该接口返回的数据存放在res.result(根据实际自行修改)
        this.renderedOptions = this.oriDataList.slice(0, LOAD_NUM)
      })
    },
    // 文本框值变化时触发 -- 从数据源中过滤出含搜索内容的数据,并取过滤结果的前n条作为下拉列表的可选项
    handleSearch (val) {
      this.searchVal = val
      let filterList = []
      if (val) {
        filterList = (this.oriDataList).filter(item => item.indexOf(val) > -1)
      } else {
        filterList = this.oriDataList
      }
      this.filterDataList = filterList
      this.renderedOptions = filterList.length < LOAD_NUM ? filterList : filterList.slice(0, LOAD_NUM)
    },
    // 滚动时触发(防止抖动)
    handlePopupScroll: debounce(function () {
      if (this.searchVal === '') {
        this.loadMoreData(this.oriDataList)
      } else {
        this.loadMoreData(this.filterDataList)
      }
    }, 400),
    // 加载更多数据到select框
    loadMoreData (dataList) {
      const renderedLen = this.renderedOptions.length // 已渲染的下拉列表长度
      const totalLen = dataList.length // 当前数据源的长度
      let addList = []
      if (renderedLen < totalLen) {
        if (renderedLen + LOAD_NUM <= totalLen) {
          addList = dataList.slice(renderedLen, renderedLen + LOAD_NUM)
        } else {
          addList = dataList.slice(renderedLen, renderedLen + (totalLen % LOAD_NUM))
        }
        this.renderedOptions = (this.renderedOptions).concat(addList)
      }
    },
    // 被选中时调用,参数为选中项的 value (或 key) 值
    handleSelect (val) {
      if (this.searchVal) {
        const selectedArr = (this.oriDataList).filter(item => item === val) // 从数据源中过滤出下拉框选中的值,并返回一个数组
        const restList = (this.oriDataList).filter(item => item !== val) // 从数据源中过滤出其他的值,返回一个数组
        const newList = selectedArr.concat(restList).slice(0, LOAD_NUM) // 将选中的元素放到下拉列表的第一位
        this.renderedOptions = newList // 更新已渲染的下拉列表
        this.oriDataList = selectedArr.concat(restList) // 更新数据源
        this.searchVal = '' // 因为触发handleSelect函数时,会自动清空用户输入的内容。因此,searchVal需要重置。
      }
    }
  }
}
</script>
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要搭建一个基于Vite、Ant Design和Vue 3的项目,你可以按照以下步骤进行操作: 1. 首先,你需要安装Vite。你可以通过运行以下命令来安装最新版本的Vite: ``` npm init vite@latest my-project cd my-project npm install ``` 这将创建一个新的Vite项目,并安装所有必要的依赖项。 2. 接下来,你需要安装Ant Design Vue。运行以下命令来安装Ant Design Vue库: ``` npm install ant-design-vue@next ``` 这将安装最新版本的Ant Design Vue,并将其添加到你的项目中。 3. 配置路由。你可以通过以下步骤来配置Vue Router: - 首先,运行以下命令来安装Vue Router: ``` npm install vue-router@next ``` - 在你的项目的src目录下创建一个名为"router"的文件夹。 - 在"router"文件夹中创建一个名为"index.js"的文件,并配置你的路由信息。 - 最后,在项目的"main.js"文件中引入并使用Vue Router。 以上是使用Vite、Ant Design VueVue 3搭建项目的基本步骤。你可以根据需要进一步添加其他功能和组件。祝你搭建项目成功!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3+vite+antd 后台管理系统基础模板](https://download.csdn.net/download/yehaocheng520/87420798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vite + vue3 + Antd 搭建后台管理系统](https://blog.csdn.net/m0_58094704/article/details/127850749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sun Peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值