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

本期简介

下拉框这个组件用的地方非常多,普通用法就是将数据列表一次性查询渲染,在列表里面直接本地搜索,优点是可缓存、速度快,但在某些场合并不适用,比如要在下拉框中选择一所中国的学校,幼儿园/小学/初中/高中/大学加起来总共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组件设置默认值过程效果图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[AutoSar]DaVinci Developer 命名规范

目录 关键词平台说明一、背景二、Component命名约定2.1Component Type Composition&#xff08;CtCo&#xff09;2.2Component Type Application&#xff08; CtAp&#xff09;2.3Component Type SensorActuator&#xff08;CtSa&#xff09;2.4Component Type Complex Driver&…

ThreadPoolExecutor中的keepAliveTime详解

一.keepAliveTime的概念&#xff1a; keepAliveTime的单位是纳秒&#xff0c;即1s1000000000ns&#xff0c;1秒等于10亿纳秒。 keepAliveTime是线程池中空闲线程等待工作的超时时间。 当线程池中线程数量大于corePoolSize&#xff08;核心线程数量&#xff09;或设置了allowCor…

【自学笔记】01Java基础-07面向对象基础-01封装

记录学习Java基础中有关面向对象编程的基础知识&#xff0c;包括面向对象思想&#xff0c;构造方法&#xff0c;封装思想&#xff0c;JavaBean。 1 面向对象概述 1.1 什么是面向对象编程 严谨来说&#xff1a;   面向对象编程&#xff08;Object-Oriented Programming&…

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

本章&#xff1a;将展示SpringBoot集成Redis三种客户端的配置要点和常见应用示例&#xff1b;下章&#xff1a;自行实现一个方法级的缓存注解&#xff0c;简化版的Cacheable&#xff0c;使初学者加深对Spring缓存框架的理解。 一、Lettuce客户端 Lettuce 是一种可扩展的、线程…

lf 的年终总结(2023)

这一年&#xff0c; 我没有进行总结&#xff0c; 只有年终的回顾。 是的&#xff0c; 我又长了一岁&#xff0c; 同时也度过了三年的开发经历&#xff0c; 即将进入五年 Android 开发的阶段。 我只希望在新的一年里能够好好学习&#xff0c;期待有所提升。 回顾过去的生活&…

FAST-LIO2:论文和算法解析

文章目录 摘要一、简介二、相关工作2.1雷达惯导里程计2.2 建图过程中的动态数据结构 三、系统架构四、状态估计A. 卡尔曼模型1.状态转换模型2.测量模型 B.迭代卡尔曼滤波1. 预测过程2. 残差计算3.迭代更新 五、建图A.地图管理B.树的结构与创建1.数据结构2.ikd树的创建 C.地图的…

给Flutter + FireBase 增加 badge 徽章,App启动器 通知红点。

在此之前需要配置好 firebase 在flutter 在项目中。&#xff08;已经配置好的可以忽略此提示&#xff09; Firebase 配置教程&#xff1a;flutter firebase 云消息通知教程 (android-安卓、ios-苹果)_flutter firebase_messaging ios环境配置-CSDN博客 由于firebase 提供的消息…

ThreadLocal 是什么?它的实现原理呢?

一个工作了 4 年的小伙伴&#xff0c;又私信了我一个并发编程里面的问题。 他说他要抓狂了&#xff0c;每天 CRUD&#xff0c;也没用到过 ThreadLocal 啊&#xff0c;怎么就不能问我怎么写CRUD 呢&#xff1f; 我反问他如果只问你项目和业务&#xff0c;那有些 4 年的小伙伴他…

光线追踪原理

理论 参考 实现光线追踪算法 光线追踪算法采用由像素组成的图像。对于图片中的每个像素&#xff0c;它会将主光线射入场景&#xff08;从眼睛&#xff08;或相机&#xff09;射入场景的第一条光线称为主光线、能见度光线或相机光线。&#xff09;。该主光线的方向是通过追踪…

2.0.0 BGP高级特性-ASFilter、CommunityFilter、ORF、对等组

Peer Group BGP对等体组 在网络中出现多台设备配置相近的情况下&#xff0c;使用对等体组可以极大的减少配置命令的输入。 与端口组类似&#xff0c;通过创建一个组&#xff0c;然后将成员添加入其中&#xff0c;可以对组中的成员进行统一的管理。 案例配置1 以AR2为例&…

Python split()方法详解:分割字符串

Python 中&#xff0c;除了可以使用一些内建函数获取字符串的相关信息外&#xff08;例如 len() 函数获取字符串长度&#xff09;&#xff0c;字符串类型本身也拥有一些方法供我们使用。 注意&#xff0c;这里所说的方法&#xff0c;指的是字符串类型 str 本身所提供的&#x…

ubuntu22.04配置双网卡绑定提升带宽

这里写自定义目录标题 Bonding简介配置验证参考链接 Bonding简介 bonding(绑定)是一种linux系统下的网卡绑定技术&#xff0c;可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡&#xff0c;能够提升网络吞吐量、实现网络冗余、负载均衡等功能&#xff0c;有很…

专业课130+,总分390+四川大学951信号与系统考研通信,电子信息经验分享

今年专业课130&#xff0c;总分390&#xff0c;顺利上岸&#xff0c;将近一年复习一路走来&#xff0c;感慨很多&#xff0c;希望以下经历可以给后来的同学提供一些参考。 初试备考经验 公共课&#xff1a;三门公共课&#xff0c;政治&#xff0c;英语&#xff0c;数学。在备…

基于SSM+Jsp的叮当书城、网上书城购物系统(有文档Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

怎么用活码二维码生成器?多种活码在线制作

扫码看内容的方式被很多行业应用&#xff0c;最常见的内容就是展现文字、图片、视频等类型&#xff0c;那么这种将不同内容组合展示的方法是什么样的呢&#xff1f;想要制作二维码最简单的方法可以使用二维码生成器工具来处理&#xff0c;下面就将具体的二维码制作的步骤分享给…

如何使用可视化管理工具DockerUI远程管理docker容器

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

数据资产入表正式施行,企业如何对数据资产进行会计核算?

2024年1月1日&#xff0c;《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;数据资源将作为资产在企业的会计和财务报告中确认、计量、报告和披露。这代表着企业数据相关的支出由损益变成资产类&#xff0c;可以计入资产&#xff0c;不仅可以减少投入期对利润的影响&a…

浅谈园区建设“一站式企业服务平台”的必要性!

​ 随着数字经济的快速发展与新一代信息技术的日新月异&#xff0c;打造智慧型、高效能的园区运营模式已成为现代产业园区转型升级的关键路径&#xff0c;其中&#xff0c;构建“一站式企业服务平台”成为了园区创新企业服务机制、提升企业服务效能、优化营商环境的重要举措。 …

IP地址定位技术的应用及其重要性

随着网络技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;IP地址定位技术在网络安全领域的应用也越来越广泛。本文将介绍IP地址定位技术在网络安全领域的应用及其重要性。 一、IP地址定位技术概述 IP地址定位技术是指通过一定的技术手段&#xff0c;将虚拟网络中的…

液冷数据中心生态建设启动:浪潮信息力推绿色算力产业发展

近日&#xff0c;由中国电子技术标准化研究院主办的“节能环保低碳 我们在行动”第二届电子信息行业绿色环保大会在江苏无锡盛大举行。会上&#xff0c;中国电子技术标准化研究院、浪潮信息等五家发起单位共同启动“液冷数据中心生态建设”&#xff0c;浪潮信息服务器产品线总经…