【第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;因此…

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…

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…

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.指…

计算机组成原理 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(…

P1262 间谍网络

1、思路 阅读题目&#xff0c;发现有些间谍可以是被前面的点更新&#xff0c;也就是说&#xff0c;在一开始的时候&#xff0c;把能贿赂的人员从小到达排个序&#xff0c;再使用bfs算法&#xff0c;把他们能到达的人员的贿赂价钱设置为0。 有解的情况&#xff1a; 首先如果有…

【leetcode】力扣热门之反转链表【简单难度】

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 用例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 输入&#xff1a;head [] 输出&#xff1a;[…

强化学习的数学原理学习笔记 - 时序差分学习(Temporal Difference)

文章目录 概览&#xff1a;RL方法分类时序差分学习&#xff08;Temporal Difference&#xff0c;TD&#xff09;TD for state valuesBasic TD&#x1f7e1;TD vs. MC &#x1f7e6;Sarsa (TD for action values)Basic Sarsa变体1&#xff1a;Expected Sarsa变体2&#xff1a;n-…

教程:Centos6迁移旧虚拟机文件后的网络配置教程,完美解决虚拟机移动后的网络ip变化问题

博主在工作后,想整整之前大学的虚拟机集群,因此特意从之前的旧电脑把虚拟机文件给拷贝了过来,在导入到vm-workstation,顺便能启动虚拟机后,发现之前的静态ip已经跟现在的宿主机网络不一样。想着重新配置,但觉得太麻烦,故想到了修改网卡的mac地址+网卡重配置方法,完美解…

【已解决】如何用c语言位运算输出浮点数数据

本博文源于笔者正在学习的c语言如何利用位运算输出浮点数数据类型&#xff0c;浮点数在其底部也是用二进制来处理&#xff0c;又考虑到他是低位在前高位在后的原理&#xff0c;因此进行了这样的代码编写 问题浮现 想要用c语言的位运算输出浮点数 问题源码 #include<stdi…

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…