【第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"><Selectv-model="model14"multiplefilterable: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;
}
  • 业务搜索方法
    @Overridepublic 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">selectid,name,province_name,stage_namefrom 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 asclimit 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><Selectref="school"v-model="formData.schoolId"filterableremotesize="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.mzph.cn/news/605180.shtml

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

相关文章

20240107查看Android11下移远的4G模块EC20在Firefly的AIO-3399J开发板跑通时的相关服务

20240107查看Android11下移远的4G模块EC20在Firefly的AIO-3399J开发板跑通时的相关服务 2024/1/7 11:24 缘起&#xff1a;友善之臂的SDK&#xff1a;rk3399-android-11-r20211216.tar.xz可以跑通EC20&#xff0c;但是Toybrick的不行&#xff01; 同样是Andrid11&#xff0c;因此…

【前端】下载文件方法

1.window.open 我最初使用的方法就是这个&#xff0c;只要提供了文件的服务器地址&#xff0c;使用window.open也就是在新窗口打开&#xff0c;这时浏览器会自动执行下载。 2.a标签 其实window.open和a标签是一样的&#xff0c;只是a标签是要用户点击触发&#xff0c;而wind…

Python的核心知识点整理大全66(已完结撒花)

目录 D.3 忽略文件 .gitignore 注意 D.4 初始化仓库 D.5 检查状态 D.6 将文件加入到仓库中 D.7 执行提交 D.8 查看提交历史 D.9 第二次提交 hello_world.py D.10 撤销修改 hello_world.py 注意 D.11 检出以前的提交 往期快速传送门&#x1f446;&#xff08;在文…

外贸独立站建站详细操作流程一览,跨境电商卖家营销必看!

独立站是一个独立的网站&#xff0c;包括有独立的服务器&#xff0c;独立的网站程序以及网站域名。关于独立站的优势已经说了很多&#xff0c;本文就不再细谈&#xff0c;想了解的小伙伴可以自行查找之前发布的文章观看。 今天就来说说搭建独立站的详细步骤都有哪些&#xff1f…

FlinkRestAPI

which flink 找到Flink客户端地址 如果输出结果为空&#xff0c;则说明 Flink 客户端没有安装在系统路径中。在这种情况下&#xff0c;您可以通过设置 FLINK_HOME 环境变量来指定 Flink 客户端的路径。例如&#xff1a; export FLINK_HOME/opt/flink 然后&#xff0c;您可以使…

Docker mysql 主从复制

目录 介绍&#xff1a;为什么需要进行mysql的主从复制 主从复制原理&#xff1a; ✨主从环境搭建 主从一般面试问题&#xff1a; 介绍&#xff1a;为什么需要进行mysql的主从复制 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff…

【AI视野·今日NLP 自然语言处理论文速览 第七十期】Thu, 4 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 4 Jan 2024 Totally 29 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Multilingual Instruction Tuning With Just a Pinch of Multilinguality Authors Uri Shaham, Jonathan Herzi…

英飞凌TC3xx之一起认识GTM(十一)详细说说GTM子模块TIM(TIM通道模式)

英飞凌TC3xx之一起认识GTM(十一)详细说说GTM子模块TIM(TIM通道模式) 1 PWM 测量模式TPWM2 脉冲积分模式TPIM3 输入事件模式TIEM4 输入预分频器模式TIPM5 位压缩模式TBCM6 门控定期采样模式TGPS7 串行移位模式TSSM8 常见应用举例8.1 如何配置TPIM模式8.2 如何配置TIEM模式8.…

Python3 列表--20240104

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以进行的操作包括索引,切片,加,乘,检查成员。 此外,Pyth…

【c++】map

文章目录 1.创建map对象2.使用下标访问map对象3.map::insert的使用4.查找5.删除6.遍历 1.创建map对象 对象操作功能map<k, v> m;创建一个名为m的空map对象&#xff0c;键类型为k, 值类型为v。map<k, v> m(m2)创建m2的副本map<k, v> m(b, e)创建map类型的对象…

3D点云平面拟合算法

假设你有一组 3D 中的 n 个点&#xff0c;并且想要为它们拟合一个平面。 在本文中&#xff0c;我将推导出一个简单的、数值稳定的方法&#xff0c;并提供它的源代码。 听起来很好玩&#xff1f; 我们开始吧&#xff01; NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO…

阿里云服务器“可用区”是什么意思?

阿里云可用区是什么意思&#xff1f;可用区是同一个地域下电力和网络相互独立的区域&#xff0c;可用区是用来搭建高可用高容灾应用架构的&#xff0c;因为可用区之间可以做到故障隔离。阿里云服务器网aliyunfuwuqi.com简单说下可用区什么是可用区及可用区的选择方法&#xff1…

简易计算器的实现(MFC)

文章目录 1.预备知识1.简单计算器的实现2.快捷键1.全局快捷键1.创建2.注销 2.局部快捷键 3.计算机内部浮点数的存储1.浮点数表示格式2.浮点数的计算3.实例 2.实验目的3.实验内容4.代码实现1.界面编写2.准备工作3.数字输入4.特殊数字输入&#xff08;指数与小数&#xff09;1.指…

ubuntu安装docker指定版本

ubuntu安装docker指定版本 https://docs.docker.com/engine/install/ubuntu/ 安装apt源 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.d…

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备&#xff0c;从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路&#xff0c;当主存和…

UDS诊断(ISO14229-1) 3D服务

文章目录 功能简介应用场景请求和响应1、请求2、子功能3、肯定响应4、否定响应 NRC 判断优先级顺序报文示例UDS中常用 NRC 功能简介 3D服务&#xff0c;即 WriteMemoryByAddress&#xff08;按地址写内存&#xff09;服务&#xff0c;允许客户端向服务器的一个或多个连续存储单…

开源游戏引擎:创造无限可能 | 开源专题 No.56

godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎&#xff0c;可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具&#xff0c;让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上&#xff0c;包…

虾皮广告数据分析:如何进行虾皮广告数据分析以优化广告效果

虾皮&#xff08;Shopee&#xff09;作为一家知名的电商平台&#xff0c;广告数据分析是优化广告效果的关键步骤。通过对广告数据进行深入分析&#xff0c;卖家可以了解广告的表现、找出优势和不足&#xff0c;并制定更有效的广告策略。在本文中&#xff0c;我们将介绍如何进行…

Mac 16g约等于Windows多少g?

Mac 16g 内存等于 Windows 320g 内存 何为“黄金内存”&#xff1f; Mac 的内存是用黄金做的&#xff0c;而 Windows 的内存是用铁做的。 黄金的密度是 19.32 g/cm&#xff0c;而铁的密度是 7.874 g/cm。 因此&#xff0c;16g 的黄金体积是 0.082 cm&#xff0c;而 16g 的铁…

Vue3使用Pinia

1.安装 npm i pinia 2.搭建架子文件 2.1main.js import { createApp } from vue // 引入pinia import { createPinia } from piniaimport App from ./App.vue import router from ./router // 创建pinia const app createApp(App) //安装pinia app.use(createPinia())app.use(…