vue仿淘宝地址选择组件

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
    }
  },
  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>

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

原文地址:https://www.cnblogs.com/cazj/p/10912017.html

时间: 2024-10-10 03:15:45

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

简单实现仿某宝地址选择三级联动样式

内容简单介绍 实现步骤 第一步 找准方向 第二步 开干 总结 还是题外话 内容简单介绍 简单看一下须要实现的效果,如图: 实现步骤 第一步 找准方向 事实上就是想好要用recyclerview而不是listview.假设要问我recyclerview是什么的话. . 第二步 开干 首先须要先在xml里放置这么个控件 <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layo

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

Vue实现仿淘宝商品详情属性选择的功能 2018年09月07日 17:13:35 yx_cos 阅读数:278 先看下效果图:(同个属性内部单选,属性与属性之间可以多选) 主要实现过程: 所使用到的数据类型是(一个大数组里面嵌套了另一个数组)具体格式如下: attrAndValuees: [   {   'attrId': 1,   'attrName': '味道',   'valuees': [   {   'attrId': 1,   'value': '橘子味'   },   {   'a

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

jquery实现的仿淘宝规格颜色选择效果源代码如下 jquery仿淘宝规格颜色选择效果 -收缩HTML代码 运行代码 [如果运行无效果,请自行将源代码保存为html文件运行] <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.2.min.js"></script> <style> dd,dl{zoom:1;ove

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

.header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { text-align: center; margin-top: 20px; margin-left: 10px; margin-bottom: 20px } a { cursor: pointer; text-decoration: none; color: gray } a:hover { text

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

代码地址如下:<br>http://www.demodashi.com/demo/11122.html 一.准备工作 Android开发环境,学习Android的童鞋肯定都知道了,这里我就不累述了. 二.运行效果 说了效果可能不太直观,下面上两张图看看效果淘宝地区选择效果 再来一张自己的效果 gif的效果可能不太好,大家自己用Android手机打开淘宝看看 三.项目结构 四.程序实现 展示很简单,ListView就可以了.对于动画效果,只需要在getView的时候获取到要展示的View,通过属

一款仿淘宝购物的商品列表页面多条件查询(含有单选和全部)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

Java实现HMacMD5加密,用于淘宝客JS 组件 API 调用时生成 sign 的签名

原文:Java实现HMacMD5加密,用于淘宝客JS 组件 API 调用时生成 sign 的签名 源代码下载地址:http://www.zuidaima.com/share/1550463397874688.htm HMacMD5 加密纯 Java 实现,用于淘宝客 JS 组件 API 调用时生成 sign 的签名 另外:给大家贴一段淘宝客组件 API (JS API) 调用时,生成签名的核心代码. 另外:从事淘宝客开发的童鞋,碰到啥问题可以找我交流!!! String timestamp =

高仿淘宝客户端

高仿淘宝客户端 仿淘宝安卓客户端的demo源码,主要实现了:商品的基本展示.宝贝详情,图片展示的放大缩小功能.界面之间切换的动画.购物车多项删除.弹窗的动画效果.首页广告的轮播效果.获得本机具有传感器的列表.listView的上拉刷新,下拉加载功能.二维码扫描.刮刮乐等功能和效果. 下载地址:http://www.devstore.cn/code/info/925.html 运行截图:    

仿淘宝 css,js 等静态资源合并压缩输出的 jsp 脚本 combo.jsp

原文:仿淘宝 css,js 等静态资源合并压缩输出的 jsp 脚本 combo.jsp 源代码下载地址:http://www.zuidaima.com/share/1550463482612736.htm 仿淘宝 css,js 等静态资源合并压缩输出的 jsp 脚本 自己在项目中有用到,用于脚本合并输出 , 使用示例: <link rel="stylesheet" type="text/css" href="http://www.zuidaima.c