【第6期】使用Iview的Select组件进行远程搜索并在编辑时设置一个或多个默认值

news2024/9/22 13:41:30

本期简介

下拉框这个组件用的地方非常多,普通用法就是将数据列表一次性查询渲染,在列表里面直接本地搜索,优点是可缓存、速度快,但在某些场合并不适用,比如要在下拉框中选择一所中国的学校,幼儿园/小学/初中/高中/大学加起来总共31万条数据,一次性不可能在下拉框渲染,缺点有:会卡顿、查询返回全量数据中大部分是不必要的数据。
所以远程搜索这个功能就比较适用这个场景。

  • 本期要点
  1. Iview Select组件的简单介绍
  2. 后端编写学校搜索接口
  3. 前端编写调用搜索接口的相关方法
  4. Select组件触发远程搜索
  5. 编辑时对已选择的数据设置默认值(1个和多个)
  • 最终实现效果:输入即搜索,下拉框显示了学段和所在省份的辅助信息,本例是限制的单选,官方是多选的案例。
    在这里插入图片描述

一、Iview Select组件的简单介绍
Iview Select组件官方文档:https://v4.iviewui.com/components/select

1、远程搜索示例效果

在这里插入图片描述

2、远程搜索示例源码

<template>
    <Row>
        <Col span="12">
        <Select
            v-model="model14"
            multiple
            filterable
            :remote-method="remoteMethod2"
            :loading="loading2">
            <Option v-for="(option, index) in options2" :value="option.value" :key="index">{{option.label}}</Option>
        </Select>
        </Col>
    </Row>
</template>
<script>
    export default {
        data () {
            return {
                model13: '',
                loading1: false,
                options1: [],
                model14: [],
                loading2: false,
                options2: [],
                list: ['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']
            }
        },
        methods: {
            remoteMethod2 (query) {
                if (query !== '') {
                    this.loading2 = true;
                    setTimeout(() => {
                        this.loading2 = false;
                        const list = this.list.map(item => {
                            return {
                                value: item,
                                label: item
                            };
                        });
                        this.options2 = list.filter(item => item.label.toLowerCase().indexOf(query.toLowerCase()) > -1);
                    }, 200);
                } else {
                    this.options2 = [];
                }
            }
        }
    }
</script>

3、Select官方详解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、后端编写学校搜索接口

1、后端搜索接口

接口说明:参数stage表示学段,取值的含义表示幼儿园、小学、初中、高中、大学,参数keyword表示要搜索的关键字

    @GetMapping("/api/v1/school/search")
    public Response<List<SchoolVo>> searchSchools(@RequestParam("stage") StageEnum stage, @RequestParam("keyword") String keyword) {
        return this.success(schoolService.querySchools(stage, keyword));
    }

2、业务搜索实现

学校信息字段非常多,有30多个,全部都返回是不好的实现,所以这里定义了SchoolVo只返回必要的字段给前端,至于SchoolPo属性虽然很多,但从SQL层实际上查询的也只有需要的字段,其他字段不必返回。

  • SchoolVo
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SchoolVo {
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;

    private String name;

    private String provinceName;

    private String stageName;
}
  • 业务搜索方法
    @Override
    public List<SchoolVo> querySchools(StageEnum stage, String keyword) {
        List<SchoolPo> simplePos = schoolMapper.selectSimpleSchools(stage, keyword);
        return JsonUtils.copy(simplePos, SchoolVo.class);
    }

3、Mybatis Mapper层的实现

@Mapper
public interface SchoolMapper extends BaseMapper<SchoolPo> {

    List<SchoolPo> selectSimpleSchools(@Param("stage") StageEnum stage, @Param("keyword") String keyword);
}

4、Mbatis Mapper SQL编写

这里只返回了学校id、学校名称、所在省份名称、学段,匹配使用的模糊搜索,name如果有索引,这里索引会失效,但为了考虑查询性能,这里对整个SQL做了如下优化:
(1)按需查询,网络传输数据量小
(2)使用limit 100取巧,因为该SQL是用来搜索的,如果将搜索到的全部返回,会造成查询慢、传输量大、浪费流量,即便限制500条,渲染到列表也是多余的,这种情况一般是用户搜索的时候,只输入了很少的信息,搜索出来的数据就很多,如果搜索更具体一点的学校名称,查询返回的数据量就会很少了,实际使用中,搜索接口的性能还是可以接受的,毕竟是模糊搜索
在这里插入图片描述

  • SQL
  <select id="selectSimpleSchools" resultMap="BaseResultMap">
    select
      id,
      name,
      province_name,
      stage_name
    from common_basic_school
    <where>
      <if test="stage!=null">
        stage=#{stage}
      </if>
      <if test="keyword!=null and keyword!=''">
        and name like concat('%',#{keyword},'%')
      </if>
    </where>
    order by name asc
    limit 100
  </select>

三、前端编写调用搜索接口的相关方法

1、在src/api/apis.js中增加搜索的接口请求

school.searchSchool = (params) => {
  return http.get(
    '/api/v1/school/search',
    params
  );
};

export default {school};

2、开发搜索

<FormItem label="学校" prop="schoolId">
     <div>
        <Spin size="large" fix v-if="schoolLoading">
          <Icon type="ios-loading" size=24 class="demo-spin-icon-load"></Icon>
        </Spin>
        <Select
                ref="school"
                v-model="formData.schoolId"
                filterable
                remote
                size="large"
                style="width: 600px"
                prefix="ios-home"
                multiple
                :default-label="selectedSchool"
                :filter-by-label="true"
                :label-in-value="true"
                :remote-method="searchSchool"
                :loading="schoolLoading"
                :clearable="true"
                placeholder="输入关键字搜索学校"
                @on-change="selectChange">
                <Option v-for="item in schools" :value="item.id" :key="item.id" :label="item.name">
                  <Row>
                    <Col span="16">
                      {{ item.name }}
                    </Col>
                    <Col span="3">
                      <span style="float:right;color:#ccc">{{ item.stageName }}</span>
                    </Col>
                    <Col span="3">
                      <span style="float:right;color:#ccc">{{ item.provinceName }}</span>
                    </Col>
                  </Row>
                </Option>
           </Select>
    </div>
</FormItem>

代码说明:
Spin组件:用来在搜索的时候显示加载中的状态
v-model="formData.schoolId": 组件与formData.schoolId进行双向绑定
filterable: 支持关键字过滤
remote: 支持远程搜索
multiple: 支持多选
selectedSchool:当前选中项的中文名称
filter-by-label:通过名称进行搜索过滤
remote-method:远程搜索调用的方法,参数是我们输入的内容,而不是双向绑定的schoolId
selectChange:选中某项时触发该方法,用于设置单选或多选

四、Select组件触发远程搜索

搜索时query是输入的内容,使用setTimeout让搜索间隔500毫秒发起

    searchSchool (query) {
      console.log('search', query);
      if (query) {
        this.schoolLoading = true;
        setTimeout(() => {
          apis.school.searchSchool({'stage': this.selectStage, 'keyword': query}).then(res => {
            this.schools = res.body;
          }).finally(() => {
            this.schoolLoading = false;
          });
        }, 500);
      } else {
        this.schools = [];
      }
    },

五、编辑时对已选择的数据设置默认值(1个和多个)

一般的下拉框设置默认值比较简单,和v-model双向绑定即可默认选中某项,但搜索框默认进来时空的,需要输入内容才会有数据返回,列表才会有数据,所以编辑的时候设置默认值的原理就是对select设置搜索内容》select触发远程搜索》搜索结果默认选中匹配的一项
说明:对this.$refs.school.query设置内容即可触发远程搜索

apis.album.getAlbumModDetail({albumId: albumId}).then(res => {
	this.formData = res.body;
	// 设置修改的数据
	this.formData.schoolId = this.formData.school ? this.formData.school.id : '';
	this.$refs.school.query = this.formData.school ? this.formData.school.name : '';
	console.log('query=', this.$refs.school.query);
	console.log('name=', this.formData.school.name);
});

远程搜索select组件设置默认值过程效果图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PAT 乙级 1076 Wifi密码

解题思路&#xff1a;首先这题看着复杂实际很简单&#xff0c;每题就一个正确的我们把他找出来就可以&#xff0c;之后利用和’A’ 相减加一 求出数值&#xff0c;输出即可。python代码更容易 c语言: #include<stdio.h> int main() {int n,i,j,count0;scanf("%d&q…

ssm基于Vue.js的网上招聘系统设计与实现+vue论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

MySQL视图 索引 面试题

一. 视图 视图&#xff1a;一种虚拟存在的表&#xff0c;行和列的数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的&#xff0c;只保存了sql逻辑&#xff0c;不保存查询结果 视图语法 -- 创建 create view 视图名 as 查询语句;-- 使用 select * f…

为什么要使用云原生数据库?云原生数据库具体有哪些功能?

相比于托管型关系型数据库&#xff0c;云原生数据库极大地提高了MySQL数据库的上限能力&#xff0c;是云数据库划代的产品&#xff1b;云原生数据库最早的产品是AWS的 Aurora。AWS Aurora提出来的 The log is the database的理念&#xff0c;实现存储计算分离&#xff0c;把大量…

imgaug库指南(九):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

qt-C++笔记之QProcess

qt-C笔记之QProcess code review! 文章目录 qt-C笔记之QProcess一.示例&#xff1a;QProcess来执行系统命令ls -l命令并打印出结果说明 二.示例&#xff1a;QProcess来执行系统命令ls -l命令并打印出结果&#xff0c;代码进一步丰富三.示例&#xff1a;使用 QProcess 在 Qt 中…

ROS+moveit+jakaminicob仿真运动

先浅浅的放一个官方的c文档&#xff1a; Motion Planning API — moveit_tutorials Melodic documentation 目录 一、实现运动到目标点的程序 二、在rviz里面新建扫描平台 一、实现运动到目标点的程序 &#xff08;等我得空了补一个c运行环境部署说明&#xff09; #inclu…

天线选型的关注点

一、一般注意事项 频段 常用频段为&#xff1a; 2.4GHz&#xff5e;2.5GHz&#xff0c; 5.15GHz&#xff5e;5.85GHz&#xff0c;以及双频。增益 内置天线主要关注对所需要的面的覆盖情况&#xff0c;外置天线主要关注水平面的增益要求&#xff0c;常见外置天…

Java面向对象(抽象类,接口,内部类)

文章目录 今日内容教学目标 第一章 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 第二章 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2…

网络技术基础入门全套实验-厦门微思网络CCNA实验手册

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 微思简介&#xff08;https://www.xmws.cn) 微思成立于2002年&#xff0c;是一个诚信敬业、积极向上、充满活力、专注技术服务的企业。 微思获得了八…

什么是短视频矩阵系统?效果是怎么样的?

短视频矩阵系统是一种通过将多个短视频连接起来形成一个整体的系统。它的效果是可以提供一种连贯而有序的观看体验&#xff0c;使观众可以连续地观看一系列相关的短视频内容。 短视频矩阵系统的运作方式如下&#xff1a;首先&#xff0c;用户在平台上选择一个短视频开始观看。…

小型洗衣机什么牌子好?迷你洗衣机品牌推荐

随着现代社会的快速发展&#xff0c;洗衣机已经成为了家家必备的电器产品。但是我们清洗贴身衣物的话&#xff0c;并不能直接扔进洗衣机里面洗&#xff0c;主要原因就是会与其他的衣物产生交叉的感染&#xff0c;而且又不能更好地除去贴身衣物上的细菌&#xff0c;因此一台内衣…

Visual Studio 2013 “即将退休”

新年快乐&#xff01; 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio&#xff0c;我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

StarRocks Awards 2023 年度贡献人物

2023 年行将结束。这一年&#xff0c;StarRocks 继续全方位大步向前迈进&#xff0c;在 300 贡献者的辛勤建设下&#xff0c;社区先后发布了 50 版本&#xff0c;并完成了从全场景 OLAP 到云原生湖仓的进化。 贡献者们的每一行代码、每一场布道&#xff0c;推动着 StarRocks 社…

京东商品详情API接口(item_get-获得JD商品详情)电商领域的重要角色

电商API接口在电商领域中扮演着重要的角色&#xff0c;它们为电商平台提供了许多功能和便利。以下是电商API接口的一些主要用途&#xff1a; 商品信息查询&#xff1a;通过API接口&#xff0c;第三方开发者或商家可以查询电商平台上的商品信息&#xff0c;包括商品详情、价格、…

字节跳动机器人研究团队:用大规模视频数据训练GR-1,机器人轻松应对复杂任务

最近 GPT 模型在 NLP 领域取得了巨大成功。GPT 模型首先在大规模的数据上预训练&#xff0c;然后在特定的下游任务的数据上微调。大规模的预训练能够帮助模型学习可泛化的特征&#xff0c;进而让其轻松迁移到下游的任务上。 但相比自然语言数据&#xff0c;机器人数据是十分稀…

k8s yaml文件pod的生命周期

Pod是k8s中最小限额资源管理组件&#xff0c;也是最小化运行容器化的应用的资源管理对象。 Pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。 在一个pod当中同时运行多个容器&#xff0c;在一个pod当中…

微软最新研究成果:使用GPT-4合成数据来训练AI模型,实现SOTA!

文本嵌入是各项NLP任务的基础&#xff0c;用于将自然语言转换为向量表示。现有的大部分方法通常采用复杂的多阶段训练流程&#xff0c;先在大规模数据上训练&#xff0c;再在小规模标注数据上微调。此过程依赖于手动收集数据制作正负样本对&#xff0c;缺乏任务的多样性和语言多…

王中阳Go赠书活动第一期:《TVM编译器原理与实践》

文章目录 前言TVM编译器的实现过程关于《TVM编译器原理与实践》编辑推荐内容简介作者简介图书目录书中前言/序言《TVM编译器原理与实践》全书速览入手《TVM编译器原理与实践》传送门&#xff1a;结束语参加抽奖 前言 随着人工智能的发展&#xff0c;计算机视觉、自然语言处理和…