引用类型 - JavaScript 数组对象、遍历、复制、冒泡排序、选择排序、数组方法、数组去重

news2025/1/31 2:51:06

写在前面

哎呀呀,每次都是要沉淀好久好久才能更一篇文章…基本上半个月都很难出一篇,但还是想把这个系列做起来,主要是为了记录自己学习和开发的过程,以便在面试的时候讲项目,能说得头头是道(◍•ᴗ•◍)

马上就要开始准备面试啦~想冲冲冲去北京!!我也会努力更文哒!! 💪 💪

简介

今天来讲讲怎么封装一个城市选择器吧~

大概介绍一下它的功能,能够按照城市或省份进行分类选择,其中每个tab下都有按照字母拼音开头的选择,点击后能跳转到相应的区域去选择具体城市,右上角还有一个下拉框选择器,可以直接选择对应的城市,默认按照拼音顺序排列,效果如下

大体框架先搭建起来,捋一捋这个小组件的封装逻辑~

1.首先需要行文字来显示城市,然后还有上下箭头以标识是否显示弹出框2.弹出框以及里面元素的布局3.处理数据并渲染到对应DOM元素上4.最后是书写跳转和选择的逻辑5.完善右上角下拉选择框逻辑好~大概的思路我们已经建立了,接下来就让我们开始实战吧ꉂꉂ꒰•̤▿•̤*ૢ꒱

第一步

虽然效果图上看起来是只有两个元素,但其实有三个呢,其中一个被隐藏了

这个是用v-if和v-else,加上给这俩图标一个visible属性,设置Boolean值来控制显示和隐藏的

但其实有更好的解决方案,确实是只有两个元素来做这个。我们知道,v-if的切换开销是相对来说比较大的,因为它操作的是DOM元素的存在与否,这样容易引起浏览器的Layout回流,渲染的性能相对来说比较低

所以取而代之的是,通过操作样式来实现这个功能

<template #reference><div class="result"><div>{{ result }}</div><div><el-icon-arrowdown :class="{ 'rotate': visible }"></el-icon-arrowdown></div></div>
</template>

<style lang='scss' scoped> .rotate {transform: rotate(180deg);
} </style> 

我们给这个图标组件动态绑定样式,通过rotate来控制它的标识性,也摒弃了两个图标来做转化的思路,而是用css3内置的属性来做这个功能,点击后把图标进行180°旋转

第二步

这边主要就是考验基本功了,布局走起~

你以为那些字母会是好多好多个span?吼吼!才不是呢

首先后台给的数据格式是这样的

值得学习的一点是,这边是动态渲染DOM然后进行布局,代码真的很优雅好吧!!

<div class="city"><!--<div v-for="(value, key) in cities">{{key}}</div> --><!-- 字母区域 --><divclass="city-item"@click="clickChat(item)"v-for="(item, index) in Object.keys(cities)">{{ item }}</div>
</div> 

这边有渲染字母,也就是object的key值两种方法,一种是直接遍历这个cities对象,另一种调用Object.keys()方法遍历cities的key本身,大家取贴合自己学习习惯的方法就好~

第三步

数据格式如上所述,需要渲染成效果图那样,左边显示的是key,右边显示的是城市

<el-scrollbar max-height="300px"><template v-for="(value, key) in cities" :key="key"><el-row style="margin-bottom: 10px;" :id="key"><el-col :span="2">{{ key }}:</el-col><el-col :span="22" class="city-name"><div@click="clickItem(item)"class="city-name-item"v-for="(item, index) in value":key="item.id"><div>{{ item.name }}</div></div></el-col></el-row></template>
</el-scrollbar> 

直接在template里面处理数据,也是同样的遍历操作,用el-row和el-col来分区域,左边占2份的是拼音(或省份)部分,右边占22份的是城市部分

我们来审查一下元素以验证,对视觉要求比较高的小伙伴也可以根据实际情况进行微调

第四步

这里是最最最难写的部分啦 🤣 🤣也是最容易出bug的部分,我们一步一步来仔细分析吧~

首先明确我们的目标,在这一步我们需要实现两个主要功能:

1.点击字母拼音能跳转到对应区域2.点击要选择的城市之后渲染在一开始的span上#### 4.1 功能一

功能一的核心实现在于跳转,怎么实现这个跳转比较好呢?

我们都知道,在原生开发中做这个功能最熟悉最常见的就是用a标签来做这个区域跳转

但是a标签的实现原理是_通过改变路由来实现跳转功能的_,这就意味着,如果我们用a标签那就要更改路径,但我们这个封装组件的整体是放在vue3项目中的,不便于我们实现功能

好在我们还能调用原生的DOM方法,不知道大家有没有见过这个scrollIntoView方法

// 点击字母区域
let clickChat = (item: string) => {let el = document.getElementById(item)//操作原生DOM,跳转到指定区域if (el) el.scrollIntoView()
} 

4.2 功能二

我们首先找到渲染城市数据的DOM元素,然后给它绑定一个clickItem事件

<el-col :span="22" class="city-name"><div@click="clickItem(item)"class="city-name-item"v-for="(item, index) in value":key="item.id"><div>{{ item.name }}</div></div>
</el-col> 

在这一步骤我们需要做的事情有两个: 一个是渲染选择到的城市并且分发事件给父组件,二是关闭弹出框

// 点击每个城市
let clickItem = (item: City) => {// 给结果赋值result.value = item.name// 关闭弹出层visible.value = falseemits('changeCity', item)
} 

往往我们自己做项目的时候想不到细节处,比如选择完毕之后关闭弹出框。实际上逻辑并不复杂,但真正自己动手敲起来还真没那么容易哈,不敲不知道,一敲bug一堆( Ꙭ)

第五步

还有最后一个功能就是右上角的下拉选择框,这边我们也细分为两个功能要实现

1.自定义搜索城市,可以根据中文也可以根据拼音搜索2.下拉框选择城市#### 5.1 功能一

自定义搜索,我们需要在setup中新建一个filterMethod方法用来过滤数据

并且对数据先进行一个简单的处理方便后续进行过滤,取到cities.value是一个数组对象,我们用flat方法将它解析出来

// 自定义搜索过滤
let filterMethod = (val: string) => {console.log(cities.value)let values = Object.values(cities.value).flat(2)
} 

打印出的cities.value如下

根据MDN文档介绍,flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回

处理过后的values如下图所示

经过了这些数据处理之后,再来定义过滤搜索的内容

分为三种情况,一种是val为空,二是按照中文过滤,三是按照拼音过滤,过滤的核心方法是通过filter和includes去判断是否遍历的数据中是否包含val,然后返回对应的结果

// 自定义搜索过滤
let filterMethod = (val: string) => {let values = Object.values(cities.value).flat(2)if (val === '') {options.value = values} else {if (radioValue.value === '按城市') {// 中文和拼音一起过滤options.value = values.filter(item => {return item.name.includes(val) || item.spell.includes(val)})} else {// 中文过滤options.value = values.filter(item => {return item.name.includes(val)})}}
} 

5.2 功能二

下拉框选择城市也需要进行数据匹配,这里涉及到一个很实用的数组方法_Array.prototype.find()_

find() 方法返回数组中满足提供的测试函数的第一个元素的值,否则返回 undefined

// 所有的城市数据
let allCity = ref<City[]>([])
// 下拉框显示城市的数据
let options = ref<City[]>([])

// 下拉框选择
let changeSelect = (val: number) => {let city = allCity.value.find(item => item.id === val)!result.value = city.nameif (radioValue.value === '按城市') {emits('changeCity', city)} else {emits('changeProvince', city.name)}
} 

这里用数组的find方法去查找符合id匹配的数据,找得到就将返回值赋值给city

然后再取city的name赋值到城市选择器最终结果的span上

总结

到这里整个封装城市选择器这个组件的工作差不多就结束啦~

个人最大的感触就是,乍一看这个组件还是挺复杂的,但是一步步把它拆解开来之后发现,每一个细小处的工作其实并不难,难的是如何将这些拆分的步骤组织成一个完整的组件架构

也希望这篇文章能给大家一些思路和启发~ 🥰 🥰

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

Clickhouse

目录 Clickhouse简介 整体架构 数据接入层 数据存储层 数据服务层 数据应用层 Clickhouse简介 目前企业用户行为日志每天百亿量级&#xff0c;虽然经过数仓的分层以及数据汇总层通用维度指标的预计算&#xff0c;有些个性化的分析场景还是需要直接编写程序或sql查询&…

python人工智能学习需要学什么?

前言 如果要从科技领域找出最大的变化和革新&#xff0c;那么我们很难不说到“人工智能”这个关键词。人工智能催生了大量新技术、新企业和新业态&#xff0c;为个人、企业、国家乃至全球提供了新的经济增长点&#xff0c;上到谷歌、苹果、百度等巨头&#xff0c;下到各类创业…

发布-订阅模式解读

发布-订阅模式 先简单说一下发布订阅模式各个组件的定义: 发布者 Publisher : 状态改变时 , 向 消息中心 发送事件 ; 订阅者 Subscriber : 到 消息中心 订阅自己关心的事件 ; 消息中心 : 负责维护一个 消息队列 , 根据 消息类型 将 消息 转发给 对应的 订阅者 ; 下面按照该…

差错控制方法----循环冗余码计算

差错控制方法----循环冗余码计算 循环冗余码&#xff0c;又称为多项式码。CRC的工作方法是在发送端产生一个冗余码&#xff0c;附加在信息位后面一起发送到接收端&#xff0c;接收端收到的信息按发送端形成循环冗余码同样的算法进行校验&#xff0c;如果发现错误&#xff0c;则…

(附源码)php校园电子图像信息采集系统 毕业设计 010930

目 录 摘要 1 1 绪论 1 1.1 研究背景 1 1.2研究内容 1 1.3论文结构与章节安排 1 2 校园电子图像信息采集系统 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1 数据增加流程 3 2.2.2 数据修改流程 4 2.3.3数据删除流程 4 2.3 系统功能分析 4 2.3.1 功能性分析 4 2.3.2 …

多态——C++第三大特性

目录 一、多态的概念 1、概念 二、多态的定义及实现 1、构成条件 2、虚函数 3、虚函数的重写 4、C11提供了override和final两个关键字&#xff0c;可以帮助用户检测是否重写 5、重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08;重定义&#xff09;的对比 三、…

pytorch环境配置

pytorch环境配置pytorch环境配置1.NVIDIA驱动安装与更新1.查看自己的电脑显卡版本2.下载显卡驱动3.安装与验证2.pytorch环境安装1.打开anaconda的终端2. 创建虚拟环境3.换源4.安装5.验证3.pycharm项目的pytorch环境设置pytorch环境配置 使用Anacondapycharm搭建pytorch环境 提…

常见的四大搜索引擎区别

一般应用或网站的信息会存储在数据库中&#xff0c;而随着时间的推移&#xff0c;数据库中的信息量达到一个量级后会出现访问速度变慢的情况&#xff0c;例如用户在客户端搜索一个商品名称&#xff0c;系统可能加载了好几秒才显示数据&#xff0c;这个时候就需要进行一些优化处…

ET框架(三)

Model》数据 HotFix》行为 ET框架中的ECS和Unity的ECS无关 hotfix 静态类静态方法>行为 可以控制组件 Model》数据 继承Entity IAwake初始化 Scene实体的子实体类型 特殊&#xff1a; Unity.hotfixView : Unity相关的行为 Unity .modeView: Unity相关的数据 代码公用&a…

WSL_01 Windows WSL 安装并配置镜像与SSH

文章目录1 WSL介绍2 安装步骤2.1 启用适用于 Linux 的 Windows 子系统2.2 检查运行 WSL 2 的要求2.3 启用虚拟机功能2.4 下载 Linux 内核更新包2.5 将 WSL 2 设置为默认版本2.6 安装所选的Linux 分发解决无法打开微软商店2.6.1 配置网络2.6.2 使用官方教程的链接2.6.3 使用命令…

Redis实战——达人探店

目录 1、发布笔记 1.1 上传图片 1.2. 发表博文功能&#xff1a; 2. 查看探店笔记 3. 点赞功能的实现 4. 点赞排行榜的实现 1、发布笔记 笔记类似点评网站的评价&#xff0c;往往是图文结合。 对应的表有两个 tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的…

java计算机毕业设计springboot+vue高校本科学生综评系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以远程教育系统的实际应用需要出发,架构系统来改善现高校本科学生综评系统工作流程繁琐等问题。不仅如此以操作者的角度来说,该系统的架构能够对多媒…

网络流量回溯分析助力企业实现高效率运维(二)

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映&#xff0c;汽车配件电子图册调用图纸时&#xff0c;出现访问慢现象。 某汽车总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图册系…

在Python里使用ChatGPT

前言 近来chatGPT挺火的&#xff0c;也试玩了一下&#xff0c;确实挺有意思。这里记录一下在Python中如何去使用chatGPT。 本篇文章的实现100%基于 chatGPT&#xff0c;我是搬运工无疑了&#xff01;&#xff01;&#xff01; 本片文章比较简单&#xff0c;下一篇基于本文章来写…

景联文科技:推动智慧医疗进程,浅谈运用到的数据标注技术

“近年来&#xff0c;人工智能蓬勃发展&#xff0c;不断赋能医疗健康领域&#xff0c;改善患者的就医体验&#xff0c;有效提高医疗质量。智能医疗的实现需要许多专业且精准的标注数据不断对智慧医疗技术中包含的算法模型进行训练调优。” 从2015年至今&#xff0c;我国急性脑梗…

java+MySQL 002ssm病人健康档案管理系统#毕业设计

随着时代的发展,人们对健康越来越重视。如何呢能够更好的对病人的健康档案信息进行管理是当前很多人关心的一个问题。本期系统也是出于这样的目的而进行开发的。 研究内容 1.不同用户的登录问题&#xff1a;根据用户的类别;超级管理员、普通用户;实现用户操作权限的区分并显示不…

三、数据链路层(四)流量控制和可靠传输机制

目录 4.1流量控制和可靠传输机制 4.2三种传统ARQ方式 4.2.1单帧滑动窗口与停止-等待协议 4.2.2多帧滑动窗口与后退N帧协议&#xff08;GBN&#xff09; 4.2.3多帧滑动窗口与选择重传协议&#xff08;SR&#xff09; 4.2.4三种ARQ协议窗口大小问题 4.2.5信道利用率、信道…

视频号怎么做呢?如何发视频号?

视频号怎么做呢&#xff1f;如何发视频号&#xff1f; 视频号怎么做呢&#xff1f;如何发视频号&#xff1f; 1、明确方向 首先明确自己要做什么类型的账号&#xff0c;下面是常见的一些账号属性&#xff1a; 商品带货号美食号知识号影视号游戏号书单号音乐号家庭生活号医疗号…

JAVA开发(Redis中key的设计)

在使用redis存储数据中&#xff0c;我们可以使用任何限定长度的字符串。但是还是需要注意点规范。一般是使用树形结构 一、redis中key的设计 我总结一下几种&#xff1a; 1、使用系统结构命名法 会员系统&#xff1a; 如&#xff1a;member:service:save:user member:servi…

[附源码]Node.js计算机毕业设计高校党建信息平台Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…