【Vue3】vue3 + ts 封装城市选择组件
城市选择-基本功能
能够封装城市选择组件,并且完成基础的显示隐藏的交互功能
(1)封装通用组件src/components/city/index.vue
<script lang="ts" setup name="City"></script>
<template><div class="city"><div class="select"><span class="placeholder">请选择配送地址</span><span class="value"></span><i class="iconfont icon-angle-down"></i></div><div class="option"><span class="ellipsis" v-for="i in 24" :key="i">北京市</span></div></div>
</template><style scoped lang="less">
.city {display: inline-block;position: relative;z-index: 400;.select {border: 1px solid #e4e4e4;height: 30px;padding: 0 5px;line-height: 28px;cursor: pointer;&.active {background: #fff;}.placeholder {color: #999;}.value {color: #666;font-size: 12px;}i {font-size: 12px;margin-left: 5px;}}.option {width: 542px;border: 1px solid #e4e4e4;position: absolute;left: 0;top: 29px;background: #fff;min-height: 30px;line-height: 30px;display: flex;flex-wrap: wrap;padding: 10px;> span {width: 130px;text-align: center;cursor: pointer;border-radius: 4px;padding: 0 3px;&:hover {background: #f5f5f5;}}}
}
</style>
全局注册
import XtxCity from '@/components/city/index.vue'
export default {install(app: App) {app.component('City', City)},
}
提供类型 src/global.d.ts
import XtxCity from '@/components/city/index.vue'
declare module 'vue' {City: typeof City}
}
(2)在商品详情组件中渲染city组件 src/views/goods/components/goods-name.vue
<dl><dt>配送</dt><dd>至 <City></City></dd>
</dl>
(3)控制城市的显示和隐藏
- 点击的时候切换省市区的样式
- 切换城市弹层的显示或隐藏
<script lang="ts" setup name="City">
+ import { ref } from 'vue'
+const active = ref(false)
+const toggle = () => {
+ active.value = !active.value
+}
</script><template><div class="city">
+ <div class="select" @click="toggle" :class="{ active: active }"><span class="placeholder">请选择配送地址</span><span class="value"></span><i class="iconfont icon-angle-down"></i></div>
+ <div class="option" v-show="active"><span class="ellipsis" v-for="i in 24" :key="i">北京市</span></div></div>
</template>
(4)点击弹层外部,关闭弹层
<script lang="ts" setup>
import { ref } from 'vue'
+import { onClickOutside } from '@vueuse/core'
const active = ref(false)
const toggle = () => {active.value = !active.value
}
// 点击外面,关闭弹窗
const target = ref(null)
onClickOutside(target, () => {
// 参数1:监听哪个元素,target是通过ref绑定给我们监听盒子的
// 参数2:点击了该元素外其他地方触发的函数active.value = false
})
</script>
<template><div class="city" ref="target"><div class="select" @click="toggle" :class="{ active: active }"><span class="placeholder">请选择配送地址</span><span class="value"></span><i class="iconfont icon-angle-down"></i></div><div class="option" v-if="active"><span class="ellipsis" v-for="i in 24" :key="i">北京市</span></div></div>
</template>
城市选择-动态渲染
需求:完成城市数据的获取以及渲染
注意
城市数据并不是直接从接口服务器中获取的,而是从阿里云服务器上获取的数据,所以不能使用封装好的request发送请求,直接使用 原生的axios 发送请求即可。https://yjy-oss-files.oss-cn-zhangjiakou.aliyuncs.com/tuxian/area.jsonopen in new window
(1)定义数据类型
// 城市列表类型
export type AreaList = {code: stringlevel: numbername: stringareaList: AreaList[]
}
(2)获取数据src/components/city/index.vue
需求: 从接口获取城市数据,赋值给本地数据
- 定义列表数据变量
const cityList = ref<AreaList[]>([])
- 封装调接口的方法
- 方法内部调用接口,把获取到的结果赋值给cityList
- 调用方法
<script lang="ts" setup name="City">
import { ref } from 'vue'
import { onClickOutside } from '@vueuse/core'
import type { AreaList } from '@/types/goods'
import axios from 'axios'
// 控制弹层的显示隐藏
const active = ref(false)
const toggle = () => {active.value = !active.value
}
const target = ref(null)
onClickOutside(target, (e) => {// console.log(e)// 当点击target元素的外面的时候,就会触发active.value = false
})const cityList = ref<AreaList[]>([])
const getCityList = async () => {const res = await axios.get<AreaList[]>('https://yjy-oss-files.oss-cn-zhangjiakou.aliyuncs.com/tuxian/area.json')cityList.value = res.data
}
getCityList()
</script>
(3)渲染数据src/components/City/index.vue
<template><div class="city" ref="target"><div class="select" :class="{ active: active }" @click="toggle"><span class="placeholder">请选择配送地址</span><span class="value"></span><i class="iconfont icon-angle-down"></i></div><div class="option" v-show="active"><span class="ellipsis" v-for="item in cityList" :key="item.code">{{ item.name }}</span></div></div>
</template>
(4)点击弹层外部,关闭弹层
<script lang="ts" setup>
import { ref } from 'vue'
+import { onClickOutside } from '@vueuse/core'
const active = ref(false)
const toggle = () => {active.value = !active.value
}
// 点击外面,关闭弹窗
const target = ref(null)
onClickOutside(target, () => {
// 参数1:监听哪个元素,target是通过ref绑定给我们监听盒子的
// 参数2:点击了该元素外其他地方触发的函数active.value = false
})
</script>
<template><div class="city" ref="target"><div class="select" @click="toggle" :class="{ active: active }"><span class="placeholder">请选择配送地址</span><span class="value"></span><i class="iconfont icon-angle-down"></i></div><div class="option" v-if="active"><span class="ellipsis" v-for="i in 24" :key="i">北京市</span></div></div>
</template>
城市选择-交互逻辑
需求:
- 点击选择省市区的时候能够把省市区数据存储起来
- 根据点击的每一个节点的level决定他应该存储到省/城/区的哪个下面
- 点击的时候,需要把当前弹层城市信息替换为当前点击节点的子节点的城市信息(点击省显示市,点击市显示县)
- 如果点击的是区的节点,则需要关弹层
- 如果中途点击了关闭弹层,则需要重置城市数据
点击某个省,显示省下面的市。点击市,显示市下面的县。
根据level判断级别。
(1)给城市注册点击事件
<div class="option" v-if="active"><spanclass="ellipsis"v-for="item in cityList":key="item.code"
+ @click="selectCity(item)">{{ item.name }}</span>
</div>
(2)城市切换逻辑
// 选择城市
const changeResult = ref({provinceCode: '',provinceName: '',cityCode: '',cityName: '',countyCode: '',countyName: ''
})const selectCity = (city: AreaList) => {if (city.level === 0) {// 省changeResult.value.provinceName = city.namechangeResult.value.provinceCode = city.codecityList.value = city.areaList}if (city.level === 1) {// 市changeResult.value.cityName = city.namechangeResult.value.cityCode = city.codecityList.value = city.areaList}if (city.level === 2) {// 县(区)changeResult.value.countyName = city.namechangeResult.value.countyCode = city.code// 关闭弹窗active.value = false}
}
(3)关闭时恢复城市数据
const cityList = ref<AreaList[]>([])
const cacheList = ref<AreaList[]>([])const getCityData = async () => {const {data:res} = await axios.get<AreaListObj[]>('https://yjy-oss-files.oss-cn-zhangjiakou.aliyuncs.com/tuxian/area.json')cityList.value = rescacheList.value = res
}
getCityData()// 监听关闭弹窗的处理,恢复数据
watch(active, (value) => {// 当关闭active的时候,需要回复数据if (!value) {cityList.value = cacheList.value}
})
城市选择-完整地址处理
需求描述
- 默认展示的配送地址需要从父组件传递过来(登录的用户可以拿到当前用户的默认配送地址)
- 子组件选择完省市区需要传递给父组件,由父组件组织数据传给子组件进行展示(默认展示配送地址的数据源在父组件)
注意:完整地址需要父组件传递给子组件,将来如果登录的用户,父组件可以获取到完整的地址。
(1)父组件将城市数据传递给子组件
<script lang="ts" setup>
const userAddress = ref('江西省 九江市 不知道县')
</script><City :userAddress="userAddress"></City></dd>
(2)子组件接收,并且进行展示
注意点:具体的地址和请选择配送同时只展示一个
defineProps<{userAddress?: string
}>()<div class="select" @click="toggle" :class="{ active }"><span class="value" v-if="userAddress">{{ userAddress }}</span><span class="placeholder" v-else>请选择配送地址</span><i class="iconfont icon-angle-down"></i>
</div>
(3)子组件选择完城市,需要将数据传递给父组件
// 选择的城市结果类型
export type CityResult = {provinceCode: stringprovinceName: stringcityCode: stringcityName: stringcountyCode: stringcountyName: string
}const changeResult = ref<Partial<CityResult>>({})const emit = defineEmits<{(e: 'changeCity', value: CityResult): void
}>()const selectCity = (city: AreaList) => {if (city.level === 0) {// 省changeResult.value.provinceName = city.namechangeResult.value.provinceCode = city.codecityList.value = city.areaList}if (city.level === 1) {// 市changeResult.value.cityName = city.namechangeResult.value.cityCode = city.codecityList.value = city.areaList}if (city.level === 2) {// 县(区)changeResult.value.countyName = city.namechangeResult.value.countyCode = city.code// 关闭弹窗active.value = false// 子传父emit('changeCity', changeResult.value)}
}
优化代码(可选)
const changeResult = ref<Partial<CityResult>>({})
// record接受两个泛型参数,第一个为对象key的类型,第二个为对象值的类型
const cityMap: Record<number, 'province' | 'city' | 'county'> = {0: 'province',1: 'city',2: 'county'
}
const selectedCity = (city: AreaList) => {changeResult.value[`${cityMap[city["level"]]}Name`] = city.namechangeResult.value[`${cityMap[city["level"]]}Code`] = city.codeif (city.level === 2) {setIsShowCity(false)emits('changeCity', changeResult.value)} else {cityList.value = city.areaList}
}
(4)父组件接受数据并且处理
<dl><dt>配送</dt><dd>至<XtxCity@changeCity="changeCity":fullPath="fullPath"></XtxCity></dd>
</dl>const userAddress = ref('江西省 九江市 不知道县')
const changeCity = (changeResult: CityResult) => {userAddress.value =changeResult.provinceName +' ' +changeResult.cityName +' ' +changeResult.countyName
}
', changeResult.value)} else {cityList.value = city.areaList}
}
(4)父组件接受数据并且处理
<dl><dt>配送</dt><dd>至<XtxCity@changeCity="changeCity":fullPath="fullPath"></XtxCity></dd>
</dl>const userAddress = ref('江西省 九江市 不知道县')
const changeCity = (changeResult: CityResult) => {userAddress.value =changeResult.provinceName +' ' +changeResult.cityName +' ' +changeResult.countyName
}
相关文章:
【Vue3】vue3 + ts 封装城市选择组件
城市选择-基本功能 能够封装城市选择组件,并且完成基础的显示隐藏的交互功能 (1)封装通用组件src/components/city/index.vue <script lang"ts" setup name"City"></script> <template><div class…...
C语言if判断语句的三种用法
C if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C 语言中 if 语句的语法: if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ }如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false&…...
React中echarts的封装
做大屏的时候经常会遇到 echarts 展示 在 React (^18.2.0) 中对 echarts (^5.4.0) 的简单封装 echarts 封装使用 props 说明 参数说明类型可选值默认值opts初始化传入的 opts https://echarts.apache.org/zh/api.html#echarts…...
IV测试系统3A太阳能模拟器在光伏中应用
一、概述IV测试系统3A太阳能模拟器应具备光束准直、光斑均匀、辐照稳定、且与太阳光谱匹配的特点,使用户可足不出户的完成需要太阳光照条件的测试。科迎法电气提供多规格高品质的太阳模拟器,可适用于单晶硅、多晶硅、非晶硅、染料敏化、有机、钙钛矿等各…...
Vue 中过滤器 filter 使用教程
Vue 过滤器 filter 使用教程文章目录Vue 过滤器 filter 使用教程一、过滤器1.1 过滤器使用的背景1.2 格式化时间的不同实现1.3 过滤器的使用1.4 过滤器总结一、过滤器 1.1 过滤器使用的背景 过滤器提供给我们的一种数据处理方式。过滤器功能不是必须要使用的,因为它…...
源码numpy笔记
参考文章 numpy学习 numpy中的浅复制和深复制的详细用法 numpy中的np.where torch.gather() Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组 array本身的属性 shape:返回一个元组…...
【VUE】六 路由和传值
目录 一、 路由和传值 二、案例 三、案例存在无法刷新问题 一、 路由和传值 当某个组件可以根据某些参数值的不同,展示不同效果时,需要用到动态路由。 例如:访问网站看到课程列表,点击某个课程,就可以跳转到课程详…...
ChatGPT修炼指南和它的电力畅想
近期,ChatGPT刷屏各大社交平台,无疑成为人工智能界最靓的仔! 身为一款“会说话”的聊天机器人程序,它与前辈产品Siri、小度、微软小冰等有什么不同?先来听听小伙伴们怎么说。 ChatGPT何以修炼得这么强大?…...
基于vscode开发vue项目的详细步骤教程
1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 目录 五、vscode集成npm开发vue项目 1、vscode安装所需要的插件: 2、搭建一个vue小页面(入门vue) 3、大致理解…...
【C++初阶】1. C++入门
1. 前言 1. 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(…...
数据结构与算法(二十)快速排序、堆排序(四)
数据结构与算法(三)软件设计(十九)https://blog.csdn.net/ke1ying/article/details/129252205 排序 分为 稳定排序 和 不稳定排序 内排序 和 外排序 内排序指在内存里,外排序指在外部存储空间排序 1、排序的方法分类。 插入排序ÿ…...
TensorRT量化工具pytorch_quantization代码解析(二)
有些地方看的不是透彻,后续继续补充! 继续看张量量化函数,代码位于:tools\pytorch-quantization\pytorch_quantization\tensor_quant.py ScaledQuantDescriptor 量化的支持描述符:描述张量应该如何量化。QuantDescriptor和张量…...
buu [BJDCTF2020]easyrsa 1
题目描述 : from Crypto.Util.number import getPrime,bytes_to_long from sympy import Derivative from fractions import Fraction from secret import flagpgetPrime(1024) qgetPrime(1024) e65537 np*q zFraction(1,Derivative(arctan(p),p))-Fraction(1,Deri…...
taobao.user.openuid.getbyorder( 根据订单获取买家openuid )
¥免费不需用户授权 根据订单获取买家openuid,最大查询30个 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); UserOpenuidGetbyorderR…...
Mac iTerm2 rz sz
1、安装brew(找了很多🔗,就这个博主的好用) Mac如何安装brew?_行走的码农00的博客-CSDN博客_mac brew 2、安装lrzsz brew install lrzsz 检查是否安装成功 brew list 定位lrzsz的安装目录 brew list lrzsz 执…...
高通平台开发系列讲解(Sensor篇)Gsensor基础知识
文章目录 一、什么是SENSOR?二、Sensor的分类及作用三、Gsensor的工作原理及介绍3.1、常见Gsensor3.2、Gsensor的特性沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 Sensor 基础 一、什么是SENSOR? 传感器(英文名称:sensor )是一种检测装置,能感…...
图像处理实战--Opencv实现人像迁移
前言: Hello大家好,我是Dream。 今天来学习一下如何使用Opencv实现人像迁移,欢迎大家一起参与探讨交流~ 本文目录:一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…...
OnlyOffice验证(二)在Centos7上部署OnlyOffice编译结果
在Centos7上部署OnlyOffice编译结果 此处将尝试将OnlyOffice验证(一)DocumentServer编译验证的结果部署到Centos7上。并且使用其它服务器现有的RabbitMq和Mysql。 安装Nginx 先安装Nginx需要的依赖环境: yum install openssl* -y yum insta…...
6.补充和总结【Java面试第三季】
6.补充和总结【Java面试第三季】前言推荐6.补充和总结69_总结闲聊回顾和总结继续学习最后前言 2023-2-4 19:08:01 以下内容源自 【尚硅谷Java大厂面试题第3季,跳槽必刷题目必扫技术盲点(周阳主讲)-哔哩哔哩】 仅供学习交流使用 推荐 Jav…...
基于ssm框架大学生社团管理系统(源码+数据库+文档)
一、项目简介 本项目是一套基于ssm框架大学生社团管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,确保可…...
vulnhub靶场NAPPING: 1.0.1教程
靶场搭建靶机下载地址:Napping: 1.0.1 ~ VulnHub直接解压双击ova文件即可使用软件:靶机VirtualBox,攻击机VMware攻击机:kali信息收集arp-scan -l上帝之眼直接来看看网站可以注册账号,那就先试试。注册完后登入哦。要输…...
Docker基本介绍
最近需要将项目做成一个web应用并部署到多台服务器上,于是就简单学习了一下docker,做一下小小的记录。 1、简单介绍一下docker 我们经常遇到这样一个问题,自己写的代码在自己的电脑上运行的很流畅,在其他人电脑上就各种bug&…...
可用于标记蛋白质216699-36-4,6-ROX,SE,6-羧基-X-罗丹明琥珀酰亚胺酯
一.6-ROX,SE产品描述:6-羧基-X-罗丹明琥珀酰亚胺酯(6-ROX,SE)是一种用于寡核苷酸标记和自动DNA测序的荧光染料,可用于标记蛋白质,寡核苷酸和其他含胺分子的伯胺(-NH2)。西…...
高数:极限的定义
目录 极限的定义: 数列极限的几何意义: 由极限的定义得出的极限的两个结论: 编辑 极限的第三个结论: 例题 方法1: 编辑 方法2: 编辑 方法3: 编辑 极限的定义: 如何理…...
大数据技术之Hadoop
第1章 Hadoop概述1.1 Hadoop是什么1.2 Hadoop发展历史(了解)1.3 Hadoop三大发行版本(了解)Hadoop三大发行版本:Apache、Cloudera、Hortonworks。Apache版本最原始(最基础)的版本,对于…...
一文带你搞懂Go语言函数选项模式,Go函数一等公民。
前言 通过这篇文章《为什么说Go的函数是”一等公民“》,我们了解到了什么是“一等公民”,以及都具备哪些特性,同时对函数的基本使用也更加深入。 本文重点介绍下Go设计模式之函数选项模式,它得益于Go的函数是“一等公民”&#…...
Window.location 详细介绍
如果你需要获取网站的 URL 信息,那么 window.location 对象就是为你准备的。使用它提供的属性来获取当前页面地址的信息,或使用其方法进行某些页面的重定向或刷新。 https://www.samanthaming.com/tidbits/?filterJS#2 window.location.origin → htt…...
js侧滑显示删除按钮
效果图: <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno"><title>js侧滑显示删…...
Python - DIY - 使用dump取json某些键值对合成新的json文件
Python - Json处理前言:应用场景:基本工具:文件操作:打开文件:写文件:读文件:关闭文件并刷新缓冲区:Json字符串和字典转换:json.loads():json.dumps():Json文…...
深度剖析指针(中)——“C”
各位CSDN的uu们你们好呀,今天小雅兰的内容仍旧是深度剖析指针噢,在上一篇博客中,我已经写过了字符指针、数组指针、指针数组、数组传参和指针传参的知识点,那么这篇博客小雅兰会讲解一下函数指针、函数指针数组 、指向函数指针数组…...
国家企业信用公示系统官方网站/网站编辑
Array对象 Array对象和python里面的list对象一样,是用来存储多个对象值的对象,且方法和属性基本上类似。 一、属性 lenght 二、方法 1、concat() 用于连接两个或多个数组。类似python中的extend方法。 arrayObject.concat(arrayX,arrayX,......,arrayX)…...
公司网站被劫持怎么办/合肥seo排名公司
文章目录背景前情回顾描述方法约定slub 简介slub 结构总览slub 数据结构关系图数据结构简述数据结构介绍结构体pagekmem_cache_cpukmem_cache_nodekmem_cache全局变量kmalloc_caches其他slab管理结构slab_caches背景 前情回顾 [linux kernel]slub内存管理分析(0) 导读 描述方…...
手机网站集成支付宝/网络营销的定义是什么
单体架构比较初级,典型的三级架构,前端(Web/手机端)中间业务逻辑层数据库层。这是一种典型的Java Spring mvc或者Python Drango框架的应用。 单体架构的应用比较容易部署、测试, 在项目的初期,单体应用可以很好地运行。然而&#…...
网站域名更换相应内容/搜索引擎排名优化方案
系列文章目录 Hadoop第一章:环境搭建 Hadoop第二章:集群搭建(上) Hadoop第二章:集群搭建(中) 文章目录系列文章目录前言一、自定义文件配置1.core-site.xml2.hdfs-site.xml3.hdfs-site.xml4.ma…...
wordpress推广得积分/网络软文营销案例3篇
开源分析数据库 ClickHouse 以快著称,真的如此吗?我们通过对比测试来验证一下。ClickHouse vs Oracle先用 ClickHouse(简称 CH)、Oracle 数据库(简称 ORA)一起在相同的软硬件环境下做对比测试。测试基准使用…...
阿里云备案网站备案域名购买/百度推广账号登录入口
本文力图解析以下几个问题什么是装饰器装饰器的原理装饰器与闭包的关系装饰器的执行顺序什么是装饰器装饰器模式是一种允许动态或者静态向一个对象添加新的行为而不会影响到其他对象的一种设计模式。Python提供了一种更为自然的方式来装饰一个函数,这种方法通过在被…...