【测试开发】vue — elementUI select选择器 远程搜索实现

本文讲述了在前端开发中遇到的一个问题,即如何在Vue项目中使用ElementUI的select组件实现远程搜索功能。作者在尝试过程中发现初次搜索无结果,第二次输入时才显示结果。原因是数据未及时获取。通过在computed属性中处理数据并实时监听,成功解决了这个问题,实现了实时搜索展示。
部署运行你感兴趣的模型镜像

先提下背景:就是在测试的过程中,经常需要用到收货这个功能。在PC端下了采购单,再到APP去对应功能里,再输入好多个字段,上传图片等动作后,终于可以提交。
于是,我决定在平台上加个小工具,快捷收货,方便测试用。

那么,在收货操作中,要有收货人这个角色。为了更好的适用性,我决定做成一个搜索框,支持实时搜索人员。于是,从elementUI上找到了select选择器 远程搜索。

这里提一下,前端菜鸟怎么去用elementUI上的这些组件:

  1. 操作官方示例,感受组件的实际效果,确实是否满足你需求。
  2. 展开示例代码,关注使用的字段、方法等。
  3. copy示例代码,用你实际的数据、字段等去替换掉它,直到调试成功。
<template>
  <el-select
    v-model="value"
    multiple
    filterable
    remote
    reserve-keyword
    placeholder="请输入关键词"
    :remote-method="remoteMethod"
    :loading="loading">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
</template>

<script>
  export default {
    data() {
      return {
        options: [],
        value: [],
        list: [],
        loading: false,
        states: ["Alabama", "Alaska", "Arizona",
        "Arkansas", "California", "Colorado",
        "Connecticut", "Delaware", "Florida",
        "Georgia", "Hawaii", "Idaho", "Illinois",
        "Indiana", "Iowa", "Kansas", "Kentucky",
        "Louisiana", "Maine", "Maryland",
        "Massachusetts", "Michigan", "Minnesota",
        "Mississippi", "Missouri", "Montana",
        "Nebraska", "Nevada", "New Hampshire",
        "New Jersey", "New Mexico", "New York",
        "North Carolina", "North Dakota", "Ohio",
        "Oklahoma", "Oregon", "Pennsylvania",
        "Rhode Island", "South Carolina",
        "South Dakota", "Tennessee", "Texas",
        "Utah", "Vermont", "Virginia",
        "Washington", "West Virginia", "Wisconsin",
        "Wyoming"]
      }
    },
    mounted() {
      this.list = this.states.map(item => {
        return { value: `value:${item}`, label: `label:${item}` };
      });
    },
    methods: {
      remoteMethod(query) {
        if (query !== '') {
          this.loading = true;
          setTimeout(() => {
            this.loading = false;
            this.options = this.list.filter(item => {
              return item.label.toLowerCase()
                .indexOf(query.toLowerCase()) > -1;
            });
          }, 200);
        } else {
          this.options = [];
        }
      }
    }
  }
</script>

从示例代码里,可以看出:

  • states应该存放我后端接口返回的数据,示例里states是列表,我接口返回的也是列表,不过里面元素都是对象,每个对象里存着不同人的信息。
  • mounted()方法里面,是在渲染完成后,将states里的列表数据,进一步处理成一个对象,用map()返回一个新的列表,并且赋值给this.list
  • 最终在remoteMethod(query)方法里,根据输入的传参query,对this.list里的数据进行过滤,返回出匹配的数据,赋值到this.options,这样下拉列表就可以展示结果。
    这里的.indexOf(query.toLowerCase()) > -1,大于-1说明只要有就行,不论是不是开头也好,中间也好,或者结尾也好。比如搜“大周”,你输入“大”或者“周”,都可以搜到。

赶紧参考官方示例,满心欢喜地开始修改代码:

// mounted()内容

        mounted() {
            this.list = this.states.map(item => {
                return { value: `${item.id}`, label: `${item.role_name}-${item.ad_real_name}` };
            });
        },
// method()里内容

            remoteMethod(query) {
                if (query !== '') {
                    this.loading = true;
                    this.$axios.post("/api/receiveGoodsQuickly/getWmsAdminInfo", {
                        "ad_real_name": query,
                        "mchid": 6001
                    }).then((response) => {
                        this.states = response.data['content'];
                    });

                    setTimeout(() => {
                        this.loading = false;
                        this.options = this.list.filter(item => {
                            return item.label.toLowerCase()
                                .indexOf(query.toLowerCase()) > -1;
                        });
                    }, 1000);
                } else {
                    this.options = [];
                }
            },
。。。。。。

可是实际执行效果是这样的:
我输入第一次“张三”,没结果。当我再输入一次“张三”,返回出了对应的结果。
我继续输入“李四”,仍然没结果,再输入一次“李四”,结果出来了......

后来发现,还是不能直接套用官方示例的,因为示例代码是直接初始化了数据在states里,而我实际是要去请求后端接口才能拿到数据。如此一来,当我第一次调用到remoteMethod
方法,实际上this.list是null。当我第二次调用的时候,其实出现的是上一次的查询结果。

最终,找到了解决办法,就是在computed增加处理步骤,computed起到侦听的作用,这样可以立即得到处理好的数据。

computed: {
            listSet() {
                return this.states.map(item => {
                    return { value: `${item.id}`, label: `${item.role_name}-${item.ad_real_name}` };
                });
            }
        },
setTimeout(() => {
                        this.loading = false;
                        this.options = this.listSet.filter(item => { // 这里的this.list,换为this.listSet
                            return item.label.toLowerCase()
                                .indexOf(query.toLowerCase()) > -1;
                        });
                    }, 1000);

调试通过,搜索结果实时展示。

您可能感兴趣的与本文相关的镜像

Dify

Dify

AI应用
Agent编排

Dify 是一款开源的大语言模型(LLM)应用开发平台,它结合了 后端即服务(Backend as a Service) 和LLMOps 的理念,让开发者能快速、高效地构建和部署生产级的生成式AI应用。 它提供了包含模型兼容支持、Prompt 编排界面、RAG 引擎、Agent 框架、工作流编排等核心技术栈,并且提供了易用的界面和API,让技术和非技术人员都能参与到AI应用的开发过程中

<think>我们正在处理一个关于Vue2和ElementUISelect选择器实现的问题。用户希望看到如何在Vue2项目中实现ElementUISelect选择器的示例。根据引用[1]的内容,我们了解到一些关键点:-使用`states`存储后端返回的数据(列表形式,元素为对象)-在`mounted`生命周期钩子中处理数据,将`states`中的列表数据通过`map`处理成一个新列表,并赋值给`this.list`-实现`remoteMethod`方法,根据输入参数`query`对`this.list`进行过滤,将结果赋值给`this.options`,从而更新下拉列表我们将按照这个思路,构建一个示例。注意:用户要求的是Vue2和ElementUI,所以我们将使用Vue2的语法和ElementUISelect组件。下面是一个基本的示例,展示如何实现一个具有远程搜索功能的Select选择器。###实现步骤1.**安装ElementUI**:确保已经安装了ElementUI。2.**创建Vue组件**:在Vue组件中,使用`el-select`组件,并设置`filterable`和`remote`属性,同时指定`remote-method`方法。3.**准备数据**:通常数据来自后端接口,这里我们模拟一些数据。4.**实现远程搜索方法**:在`remoteMethod`方法中,根据输入的关键词过滤数据。###代码示例```html<template><div><el-selectv-model="value"filterableremoteplaceholder="请输入关键词":remote-method="remoteMethod":loading="loading"><el-optionv-for="iteminoptions":key="item.value":label="item.label":value="item.value"></el-option></el-select></div></template><script>exportdefault{data(){return{options:[],//下拉列表的选项value:'',//选中的值loading:false,//加载状态list:[],//存储所有数据的列表(用于过滤)states:[//模拟后端返回的数据{value:'1',label:'张三'},{value:'2',label:'李四'},{value:'3',label:'王五'},{value:'4',label:'赵六'},{value:'5',label:'孙七'},]};},mounted(){//在组件挂载后,处理原始数据,将states中的对象数组转换成我们需要的格式(这里不需要转换,因为格式已经符合)//但我们可以将states赋值给list,作为过滤的原始数据this.list=this.states.map(item=>({value:item.value,label:item.label}));//初始加载所有数据(可选)this.options=this.list;},methods:{remoteMethod(query){if(query!==''){this.loading=true;//模拟网络请求的延迟setTimeout(()=>{this.loading=false;//过滤数据:这里使用label属性进行过滤,不区分大小写this.options=this.list.filter(item=>{returnitem.label.toLowerCase().indexOf(query.toLowerCase())>-1;});},200);}else{//如果查询字符串为空,则重置为全部数据this.options=this.list;}}}};</script>```###说明1.**数据模拟**:`states`模拟后端返回的数据,每个对象包含`value`和`label`属性。2.**`mounted`钩子**:将`states`数据赋值给`list`,作为过滤的原始数据。同时,初始设置`options`为全部数据(这样一开始下拉列表会显示所有选项)。3.**`remoteMethod`方法**:-当输入框输入时,会触发该方法,传入输入的关键词`query`。-如果`query`不为空,则对`list`进行过滤,过滤条件是`label`中包含`query`(不区分大小写)。-使用`setTimeout`模拟网络请求的延迟,并设置`loading`状态,在搜索过程中显示加载指示。-如果`query`为空,则重置`options`为全部数据。4.**`el-select`组件**:-`remote`:启用远程搜索-`filterable`:允许输入过滤-`remote-method`:指定远程搜索的方法-`loading`:绑定加载状态###注意事项-实际项目中,`states`的数据应该通过API请求从后端获取,可以在`mounted`或`created`钩子中发起请求。-如果后端支持搜索,可以直接在`remoteMethod`中发起API请求,然后将返回的数据赋值给`options`。这样可以减轻前端压力,特别是数据量大的时候。###相关问题1.如何在ElementUISelect组件中实现多选?2.如何从后端API获取数据来填充Select选择器?3.ElementUISelect组件如何设置默认值?4.如何处理ElementUISelect组件在远程搜索时的防抖?[^1]:引用内容提供了关于ElementUISelect选择器远程搜索实现的思路,我们在此基础上构建了示例代码。</think>以下是 Vue2 中使用 ElementUI Select 选择器的完整实现示例,包含基础用法、远程搜索和多选功能: ### 基础 Select 选择器 ```html <template> <div> <!-- 基础选择器 --> <el-select v-model="selectedValue" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> <p>当前选择: {{ selectedValue }}</p> </div> </template> <script> export default { data() { return { selectedValue: '', options: [ { value: 'option1', label: '选项1' }, { value: 'option2', label: '选项2' }, { value: 'option3', label: '选项3' } ] } } } </script> ``` ### 远程搜索 Select(支持异步加载) ```html <template> <div> <!-- 远程搜索选择器 --> <el-select v-model="remoteValue" filterable remote placeholder="输入关键词搜索" :remote-method="remoteSearch" :loading="loading"> <el-option v-for="item in remoteOptions" :key="item.id" :label="item.name" :value="item.id"> </el-option> </el-select> </div> </template> <script> export default { data() { return { loading: false, remoteValue: '', remoteOptions: [], // 存储搜索结果 allData: [ // 模拟完整数据源 { id: 1, name: '张三' }, { id: 2, name: '李四' }, { id: 3, name: '王五' }, { id: 4, name: '赵六' } ] } }, methods: { // 远程搜索方法 remoteSearch(query) { if (query) { this.loading = true; // 模拟API请求延迟 setTimeout(() => { this.remoteOptions = this.allData.filter(item => item.name.toLowerCase().includes(query.toLowerCase()) ); this.loading = false; }, 300); } else { this.remoteOptions = []; } } } } </script> ``` ### 多选 Select 选择器 ```html <template> <div> <!-- 多选选择器 --> <el-select v-model="multipleValue" multiple filterable placeholder="选择多个选项"> <el-option v-for="item in multiOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> <p>已选择: {{ multipleValue }}</p> </div> </template> <script> export default { data() { return { multipleValue: [], multiOptions: [ { value: 'apple', label: '苹果' }, { value: 'banana', label: '香蕉' }, { value: 'orange', label: '橙子' } ] } } } </script> ``` ### 关键功能说明 1. **数据绑定**: - 使用 `v-model` 绑定选择值 - 选项数据存储在 `options` 数组中 2. **远程搜索**: - 启用 `remote` 和 `filterable` 属性 - 实现 `remoteMethod` 方法处理搜索逻辑 - 使用 `loading` 状态显示加载动画 3. **多选功能**: - 添加 `multiple` 属性启用多选 - 绑定值为数组类型 4. **选项过滤**: - 使用 `Array.filter()` 实现前端搜索 - `indexOf(query.toLowerCase()) > -1` 实现模糊匹配(不区分大小写) ### 实际应用技巧 1. **后端数据集成**: ```javascript mounted() { // 从API获取初始数据 axios.get('/api/options').then(res => { this.options = res.data; this.allData = res.data; // 保存完整数据用于搜索 }); } ``` 2. **防抖优化**(减少请求频率): ```javascript methods: { remoteSearch: _.debounce(function(query) { // 使用Lodash防抖 // 搜索逻辑... }, 500) } ``` 3. **自定义模板**: ```html <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"> <span style="float: left">{{ item.name }}</span> <span style="float: right; color: #8492a6">{{ item.department }}</span> </el-option> ``` ### 注意事项 1. 确保已正确安装 ElementUI: ```bash npm install element-ui -S ``` 2. 在 main.js 中引入: ```javascript import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` 3. 远程搜索场景建议: - 数据量小时使用前端过滤(如上示例) - 数据量大时应调用后端API接口搜索[^1] [^1]: 引用内容描述了远程搜索的核心实现逻辑,包括数据过滤和展示机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值