Vue组件:省市区地址选择组件

<template>
<div v-show="addressSelectShow" :style="{'left': leftValue + 'px', 'top': topValue + 'px' }" class="content">
<ul class="area-select">
<li v-for="(item, index) in areaMain" :key="index" :class="{'hasSelect':index === hasSelectIndex}" @click="changeArea(index)"> {{ item }} </li>
</ul>
<ul class="address-select">
<div v-show="hasSelectIndex === 0">
<li v-for="(item, index) in province" :key="index" :class="{'select-li-provice': index === pSelectLiIndex}" @click="selectProvince(index)"> {{ item.area_name }}</li>
</div>
<div v-show="hasSelectIndex === 1">
<li v-for="(item, index) in city" :key="index" :class="{'select-li-provice': index === cSelectLiIndex}" @click="selectCity(index)"> {{ item.area_name }}</li>
</div>
<div v-show="hasSelectIndex === 2">
<li v-for="(item, index) in area" :key="index" :class="{'select-li-provice': index === aSelectLiIndex}" @click="selectArea(index)"> {{ item.area_name }}</li>
</div>
<div v-show="hasSelectIndex === 3">
<li v-for="(item, index) in street" :key="index" :class="{'select-li-provice': index === sSelectLiIndex}" @click="selectStreet(index)"> {{ item.area_name }}</li>
</div>
</ul>
</div>
</template> <script>
import { getProvince, getCity } from '@/api/address_select'
export default {
name: 'AddressSelect',
props: {
addressSelectShow: { // 控制是否显示地址选择
type: Boolean,
default: true
},
leftValue: { // 定位的离左边的距离
type: Number,
default: 600
},
topValue: { // 定位的离上边的距离
type: Number,
default: 100
}
},
data() {
return {
areaMain: ['省', '市', '区', '街道'],
hasSelectIndex: 0, // 控制显示第几个
province: [], // 循环的省份的值
city: [], // 循环的城市的值
area: [], // 循环的地区的值
street: [], // 循环的街道的值
pid: '', // 省份id
cid: '', // 城市id
aid: '', // 地区id
sid: '', // 街道id
pSelectLiIndex: '', // 选中的省的下标
cSelectLiIndex: '', // 选中的城市的下标
aSelectLiIndex: '', // 选中的地区的下标
sSelectLiIndex: '', // 选中的街道的下标
addressDetail: [], // 传给父组件的地址名称
addressId: [] // 传给父组件的地址id
}
},
watch: {
isEmpty: function(newV, oldV) {
if (newV) {
this.pSelectLiIndex = ''
this.cSelectLiIndex = ''
this.aSelectLiIndex = ''
this.sSelectLiIndex = ''
this.pid = ''
this.cid = ''
this.aid = ''
this.sid = ''
this.hasSelectIndex = 0
this.addressId = []
this.$emit('getAddressDetail', this.addressDetail, this.addressId) // 此时,父组件需通过addressId的长度是否为0来判断是否将传递过来的isEmpty设置为false ,重置选择框的值
}
}
},
mounted() { this.getAllProvince() }, methods: { changeArea(index) { // 切换模块 switch (index) { // 判断是否上级有值,如果上级没值则不能切换 case 1: if (!this.pid) { return } break case 2: if (!this.pid || !this.cid) { return } break case 3: if (!this.pid || !this.cid || !this.aid) { return } break default: break } this.hasSelectIndex = index }, getAllProvince() { // 获取省份列表 getProvince().then((res) => { this.province = res.data }).catch(() => {}) }, // 选择省份执行的事件 selectProvince(index) { this.addressDetail = [] this.addressId = [] this.pid = this.province[index].id this.pSelectLiIndex = index this.cSelectLiIndex = '' this.aSelectLiIndex = '' this.sSelectLiIndex = '' this.addressId[0] = this.province[index].id this.addressDetail[0] = this.province[index].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) this.pSearchC() }, // 省份查找城市 pSearchC() { getCity(this.pid).then((res) => { // 获取省份下城市的列表 this.city = res.data this.hasSelectIndex = 1 if (this.city.length === 1) { // 如果只有一条数据,则默认选中并执行下一次查找,其他位置同理 this.hasSelectIndex = 2 this.cSelectLiIndex = 0 this.cid = this.city[0].id this.addressId.splice(1, this.addressId.length - 1) this.addressDetail.splice(1, this.addressId.length - 1) this.addressId[1] = this.city[0].id this.addressDetail[1] = this.city[0].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) this.cSearchA() } }).catch(() => {}) }, // 选择市执行的事件 selectCity(index) { this.cid = this.city[index].id this.cSelectLiIndex = index this.aSelectLiIndex = '' this.sSelectLiIndex = '' this.addressId.splice(index, this.addressId.length - 1) this.addressId[1] = this.city[index].id this.addressDetail.splice(1, this.addressDetail.length - 1) this.addressDetail[1] = this.city[index].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) this.cSearchA() }, // 市查找区 cSearchA() { getCity(this.cid).then((res) => { // 获取城市下地区的列表 this.area = res.data this.hasSelectIndex = 2 if (this.area.length === 1) { this.hasSelectIndex = 3 this.aSelectLiIndex = 0 this.aid = this.area[0].id this.addressId.splice(2, this.addressId.length - 1) this.addressDetail.splice(2, this.addressId.length - 1) this.addressId[2] = this.area[0].id this.addressDetail[2] = this.area[0].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) this.aSearchS() } }).catch(() => {}) }, // 选择区执行的事件 selectArea(index) { this.aid = this.area[index].id this.aSelectLiIndex = index this.sSelectLiIndex = '' this.addressId.splice(2, this.addressId.length - 1) this.addressId[2] = this.area[index].id this.addressDetail.splice(2, this.addressId.length - 1) this.addressDetail[2] = this.area[index].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) this.aSearchS() }, // 区查找街道 aSearchS() { getCity(this.aid).then((res) => { // 获取地区下街道的列表 this.street = res.data const obj = { id: '123456', area_name: '暂不选择' } this.street.unshift(obj) this.hasSelectIndex = 3 if (this.street.length === 1) { this.sSelectLiIndex = 0 this.sid = this.street[0].id this.addressId.splice(3, this.addressId.length - 1) this.addressDetail.splice(3, this.addressId.length - 1) this.addressId[3] = this.street[0].id this.addressDetail[3] = this.street[0].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) } }).catch(() => {}) }, // 选择区执行的事件 selectStreet(index) { this.sid = this.street[index].id this.sSelectLiIndex = index this.addressId[3] = this.street[index].id this.addressDetail[3] = this.street[index].area_name this.$emit('getAddressDetail', this.addressDetail, this.addressId) } } } </script> <style scoped rel="stylesheet/scss" lang="scss"> .content{ position: absolute; z-index: 10; background: white; .area-select{ width: 425px; height: 30px; margin: 0; padding: 0; border: 1px solid #CCCCCC; li{ list-style: none; float: left; height: 28px; line-height: 28px; text-align: center; background: #f0f0f0; width: 25%; cursor: pointer; } .hasSelect{ background: #FFFFFF; } } .address-select{ width: 425px; margin: 0; padding: 5px 10px; overflow-y: scroll; overflow-x: scroll; height: 320px; border: 1px solid #CCCCCC; border-top: 0; li{ height: 40px; padding: 10px 5px; line-height: 20px; cursor: pointer; } .select-li-provice{ color: #1470cc; cursor: default; } li:hover{ color: #968CFF; } } } </style>

前端小白一枚,欢迎大家多多交流

vue仿淘宝地址选择组件的更多相关文章

  1. vue仿淘宝订单状态的tab切换效果

    <div class="navigation">  //这里是通过循环遍历出来的数据,你需要根据index的值来判断你现在点击的是第几个tab栏导航,同时在js中写一个 ...

  2. vue仿淘宝结账订单

    <template>  <div class="container">  <div class="checkout-title"& ...

  3. Vue实现仿淘宝商品详情属性选择的功能

    Vue实现仿淘宝商品详情属性选择的功能 先看下效果图:(同个属性内部单选,属性与属性之间可以多选) 主要实现过程: 所使用到的数据类型是(一个大数组里面嵌套了另一个数组)具体格式如下:   attrA ...

  4. jquery仿淘宝规格颜色选择效果

    jquery实现的仿淘宝规格颜色选择效果源代码如下 jquery仿淘宝规格颜色选择效果 -收缩HTML代码 运行代码 [如果运行无效果,请自行将源代码保存为html文件运行] <script t ...

  5. 仿淘宝颜色属性选择展示代码(jQuery)

    模仿淘宝商品选择颜色和尺寸的效果,即选择商品颜色和尺寸的时候,把选择的颜色和尺寸放到一个页面容器里面,不足之处,还望指教. <!DOCTYPE HTML> <html lang=&q ...

  6. 仿淘宝 vue

    最近自己闲着无聊,用vue仿照淘宝打算写个皮囊,顺便把遇到的问题顺便记录下 1.动画问题 (1)单个元素给动画 <transition name="fade">< ...

  7. Android 轻松实现仿淘宝地区选择

    介绍 最近用淘宝客户端的时候,编辑地址的时候有个地区选择的功能.看上面的效果觉得挺酷,滚动的时候,是最后一个从下面飞上来挨着前一个.就自己鼓捣一个出来玩玩. 说了效果可能不太直观,下面上两张图看看效果 ...

  8. 基于Bootstrap仿淘宝分页控件实现

    .header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { t ...

  9. Android仿淘宝头条滚动广告条

    之前我使用TextView+Handler+动画,实现了一个简单的仿淘宝广告条的滚动,https://download.csdn.net/download/qq_35605213/9660825: 无 ...

随机推荐

  1. ZeroClipboard—ZeroClipboard的使用

    1.ZeroClipboard的作用: 借助Zero Clipboard能够简单高速地将内容拷贝到剪贴板,相似点击某些网页中"复制"按钮后复制对应区域的内容. 2.ZeroClip ...

  2. android好博客

    app集成支付宝.app缓存管理.app列表圆角设计.App自动更新之通知栏下载(有续).索引ListView.App数据格式之解析Json.拖拽ListView http://www.cnblogs ...

  3. HDU 1247 Hat’s Words(字典树变形)

    题目链接:pid=1247" target="_blank">http://acm.hdu.edu.cn/showproblem.php? pid=1247 Pro ...

  4. 九度OJ 1094:String Matching(字符串匹配) (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1259 解决:686 题目描述: Finding all occurrences of a pattern in a text is a p ...

  5. 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级

    先在common文件夹建立一个function.php文件,然后写一个递归函数,传递一个父id返回所有子id,如下: function getChildrenId($node,$pid){ $arr= ...

  6. mac svn命令 linux同样适用

    1.将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.1/pro/domain简写:svn ...

  7. Mall电商项目总结(二)——nginx负载均衡配置和策略

    1. nginx配置文件 用户在浏览器上输入,http://www.xwld.site/ 实际上是在访问服务器80端口,nginx 监听80端口,将用户的请求转发到8080和9080端口 . upst ...

  8. php常用加密函数总结

    $var = 123; /** * md5 加密(单项加密.不可逆) * param $var 需要加密的变量(int\float\string\bool\null),资源类型(resource)和复 ...

  9. poj 1743 Musical Theme【后缀自动机】

    不是很神的一道题,一般. 先差分,最后答案需要+1. 一个right集的len即为该right集的最长相同后缀,考虑到不能重复,所以处理一下该right集的最大与最小的ri,最后答案ans=max(a ...

  10. netstat 参数

    Netstat用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况. NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] ...