vue省市区三级联动
仿照小米之家做的一个省市区三级联动,先上代码:
HTML:
<template>
<section class="myAddress">
<section>
<section class="cont" @click="choseAdd()">
<section>
<span>所在地区:{{Province?Province:''}} {{City && City!== '请选择'?City:''}} {{District && District !== '请选择'?District:''}}</span>
</section>
<div style="clear: both"></div>
</section>
</section>
<!-- 省市区三级联动选项 -->
<section class="showChose" v-show="showChose">
<section class="address">
<section class="title">
<h4>选择您所在的地区</h4>
<span @click="closeAdd()">×</span>
</section>
<section class="title">
<div class="area" @click="provinceSelected(0)" :class="tabIndex===0?'active':''">
{{Province?Province:'请选择'}}
</div>
<div class="area" @click="citySelected(1)" :class="tabIndex===1?'active':''" v-show="Province">
{{City?City:'请选择'}}
</div>
<div class="area" @click="districtSelected(2)" :class="tabIndex===2?'active':''" v-show="City && hasDistrict">
{{District?District:'请选择'}}
</div>
</section>
<ul>
<!-- 常用城市 -->
<div v-show="showProvince" class="frequentCity">
<p class="frequentCityTip" v-show="showFrequentCity">常用城市</p>
<div class="frequentCityList">
<span class="cityName" v-for="(frequentCity, index) in frequentCitys" :key="'frequentCity'+index" @click="selectFrequentCity(frequentCity)">广州</span>
</div>
</div>
<!-- 省市区列表 -->
<li class="addList" v-for="(v , k) in info" @click="getProvinceId(v.index, v.AREA_NAME, k)" v-show="showProvince" :class="v.selected ? 'active' : ''">{{v.AREA_NAME}}</li>
<li class="addList" v-for="(v,k) in showCityList" @click="getCityId(v.index, v.AREA_NAME, k)" v-show="showCity" :class="v.selected ? 'active' : ''">{{v.AREA_NAME}}</li>
<li class="addList" v-for="(v,k) in showDistrictList" @click="getDistrictId(v.index, v.AREA_NAME, k)" v-show="showDistrict" :class="v.selected ? 'active' : ''">{{v.AREA_NAME}}</li>
</ul>
</section>
</section>
</section>
</template>
JS:
export default {
name: 'address',
data () {
return {
showChose: false, // 是否显示省市区弹框
showProvince: true, // 显示省份列表
showCity: false, // 显示城市列表
showDistrict: false, // 显示区列表
showCityList: false, // 城市数据列表
showDistrictList: false, // 区数据列表
province: , // 当前选择的省份index
city: , // 当前选择的城市index
district: , // 当前选择的区index
District: false, // 区名字
Province: false, // 省名字
City: false, // 城市名字
areaProvince: '',
areaCity: '',
areaDistrict: '',
tabIndex: , // 当前选择的tab下标
hasDistrict: true, // 是否有区
selected: false, // 是否选中(active)
info: [], // 后台交互的省市区接口数据
frequentCitys: [], // 常用城市数据
saveCityData: [], // 存储选择的省市区的缓存数据
showFrequentCity: false // 是否显示常用城市
}
},
components: {
},
computed: {
},
created () {
// 获取省市区数据
this.getAreaData()
// 从缓存读取常用城市数据
this.frequentCitys = JSON.parse(localStorage.getItem('frequentList'))
this.saveCityData = JSON.parse(localStorage.getItem('frequentList'))
if (!this.frequentCitys) {
this.showFrequentCity = false
} else {
this.showFrequentCity = true
}
},
mounted () {
},
methods: {
// 获取省市区数据
getAreaData () {
console.log('获取省市区数据')
this.$root._axios('post', 'url', {})
.then(res => {
console.log('res', res.data.nodes)
if (res.data.nodes.length <= ) {
console.log('网络异常')
} else {
this.info = res.data.nodes
}
})
},
// 选择常用城市
selectFrequentCity: function (frequentCityData) {
console.log('frequentCityData', frequentCityData)
},
// 点击选择省市区
choseAdd: function () {
this.showChose = true
},
// 关闭弹框
closeAdd: function () {
this.showChose = false
},
/* eslint-disable */
// 对选择当前的数据,进行下一级的数据的筛选
_filter (add, name, code) {
let result = []
for (let i = ; i < add.length; i++) {
if (code == add[i].index) {
result = add[i][name]
}
}
return result
},
/* eslint-enable */
// 选择省份列表
getProvinceId: function (code, input, index) {
this.tabIndex =
this.province = code
this.Province = input
this.showProvince = false
this.showCity = true
this.showDistrict = false
if (!this.City) {
} else {
this.City = '请选择'
}
if (!this.District) {
} else {
this.hasDistrict = false
this.District = '请选择'
}
this.showCityList = this._filter(this.info, 'city', this.province)
// 点击选择当前
/* eslint-disable */
this.info.map(a => a.selected = false)
/* eslint-enable */
this.info[index].selected = true
this.areaProvince = input
},
// 点击省份tab
provinceSelected: function (index) {
this.tabIndex = index
// 选项页面的切换
this.showProvince = true
this.showCity = false
this.showDistrict = false
},
// 选择城市列表
getCityId: function (code, input, index) {
this.tabIndex =
this.city = code
this.City = input
this.showProvince = false
this.showCity = false
this.showDistrict = true
this.District = '请选择'
this.showDistrictList = this._filter(this.showCityList, 'district', this.city)
console.log('this.showDistrictList', this.showDistrictList)
// 选择当前添加active
/* eslint-disable */
this.showCityList.map(a => a.selected = false)
/* eslint-enable */
this.showCityList[index].selected = true
this.areaCity = input
// 判断当前选的城市是否有地区
if (this.showDistrictList.length === ) {
this.hasDistrict = false
this.showDistrict = false
this.District = false
this.showChose = false
// 把选择的省市放入缓存中
let selectCity = {}
selectCity.province = this.Province
selectCity.city = this.City
selectCity.district = ''
this.saveCityData.push(selectCity)
localStorage.setItem('frequentList', JSON.stringify(this.saveCityData))
} else {
this.hasDistrict = true
this.showDistrict = true
}
},
// 点击城市tab
citySelected: function (index) {
this.tabIndex = index
this.showProvince = false
this.showCity = true
this.showDistrict = false
},
// 选择区列表
getDistrictId: function (code, input, index) {
this.district = code
this.District = input
// 选择当前添加active
/* eslint-disable */
this.showDistrictList.map(a => a.selected = false)
/* eslint-enable */
this.showDistrictList[index].selected = true
// 选取市区选项之后关闭弹层
this.showChose = false
this.areaDistrict = input
// 把选择的数据放入缓存中
let selectCity = {}
selectCity.province = this.Province
selectCity.city = this.City
selectCity.district = this.District
this.saveCityData.push(selectCity)
localStorage.setItem('frequentList', JSON.stringify(this.saveCityData))
},
// 点击区tab
districtSelected: function (index) {
this.tabIndex = index
this.showProvince = false
this.showCity = false
this.showDistrict = true
}
}
}
CSS:
.myAddress {
width: %;
background-color: white;
border-top: 4px solid rgba(, , , );
color: #;
}
.myAddress .cont {
border-bottom: 1px solid rgba(, , , 0.8);
}
.myAddress .cont span {
display: inline-block;
font-size: .28rem;
color: #;
line-height: .88rem;
margin-left: .32rem;
}
.myAddress .cont section {
float: left;
}
.myAddress .cont img {
float: right;
width: .14rem;
height: .24rem;
margin: .32rem .32rem .32rem ;
}
.showChose {
width: %;
height: %;
position: fixed;
top: ;
left: ;
z-index: ;
background: rgba(, , , 0.8);
}
.address {
position: absolute;
bottom: ;
left: ;
z-index: ;
background: #fff;
width: %;
}
.title h4 {
display: inline-block;
margin-left: 2rem;
font-size: .32rem;
line-height: .88rem;
font-weight: normal;
color: #;
}
.title span {
margin: .42rem .2rem;
font-size: .45rem;
line-height: .34rem;
color: #D8D8D8;
}
.area {
display: inline-block;
font-size: .24rem;
line-height: .88rem;
margin-left: .42rem;
color: #;
}
.addList {
padding-left: .32rem;
font-size: .34rem;
line-height: .88rem;
color: #;
}
/* 修改的格式 */
.address ul {
height: .4rem;
margin-left: %;
max-height: .4rem;
overflow: auto;
}
.address .title .active {
color: #0071B8;
border-bottom: .02rem solid #0071B8;
}
.address ul .active {
color: #0071B8;
}
.frequentCity{
width: %;
}
.frequentCityTip{
text-align: left;font-size: .3rem;margin: .3rem;font-weight: bold;
}
.frequentCityList{
display: -webkit-box; /* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */
display: -moz-box; /* Firefox 17- */
display: -webkit-flex; /* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */
display: -moz-flex; /* Firefox 18+ */
display: -ms-flexbox; /* IE 10 */
display: flex; /* Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */
flex-wrap: wrap;margin-right: %;margin-left: %;
}
.cityName{
letter-spacing: .06rem;margin: .1rem .1rem .3rem .6rem;font-size: .29rem;
}
逻辑分析:首先调用接口,获取省市区数据,然后对省市区数据进行拆分。
具体分析,后面更新
这个是调用接口返回的数据其中一些,具体的参数还可以根据需求再添加。
info: [
{
index: ,
AREA_NAME: '北京',
city: [
{
index: ,
AREA_NAME: '北京市',
district: [
{
index: ,
AREA_NAME: '东城区'
},
{
index: ,
AREA_NAME: '西城区'
},
{
index: ,
AREA_NAME: '崇文区'
}
]
}
]
},
{
index: ,
AREA_NAME: '河北',
city: [
{
index: ,
AREA_NAME: '石家庄市',
district: [
{
index: ,
AREA_NAME: '长安区'
},
{
index: ,
AREA_NAME: '桥东区'
},
{
index: ,
AREA_NAME: '桥西区'
}
]
},
{
index: ,
AREA_NAME: '唐山市',
district: [
{
index: ,
AREA_NAME: '路南区'
},
{
index: ,
AREA_NAME: '路北区'
},
{
index: ,
AREA_NAME: '古冶区'
}
]
}
]
vue省市区三级联动的更多相关文章
- vue省市区三级联动(高仿京东)
该栗子是我直接从公司的项目单独拉出来的(懒得重新写一次了),所以代码会有些冗余,下面直接看效果: 接着上代码: html: <template> <div> <div c ...
- vue仿京东省市区三级联动选择组件
工作中需要一个盒京东购物车地址选择相似的一个省市区三级联动选择组件,google查了下都是下拉框形式的,于是自己写了一个,希望对使用vue开发项目的朋友有帮助,显示效果如下:使用vue2.0开发 ht ...
- vue 引用省市区三级联动(element-ui Cascader)
npm 下载 npm install element-china-area-data -S main.js import {provinceAndCityData,regionData,provinc ...
- vue 引用省市区三级联动(插件)
vue 用省市区三级联动之傻瓜式教程(复制粘贴即用) npm 下载 npm install v-distpicker --save main.js //引入 省市区三级联动 import Distpi ...
- JS实现年月日三级联动+省市区三级联动+国家省市三级联动
开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...
- jQuery省市区三级联动插件
体验效果:http://hovertree.com/texiao/bootstrap/4/支持PC和手机移动端. 手机扫描二维码体验效果: 代码如下: <!DOCTYPE html> &l ...
- 省市区三级联动 pickerView
效果图 概述 关于 省市区 三级联动的 pickerView,我想大多数的 iOS 开发者应该都遇到过这样的需求.在遇到这样的需求的时候,大多数人都会觉的这个很复杂,一时无从下手.其实真的没那么复杂. ...
- JS省市区三级联动
不需要访问后台服务器端,不使用Ajax,无刷新,纯JS实现的省市区三级联动. 当省市区数据变动是只需调正js即可. 使用方法: <!DOCTYPE html><html>< ...
- ajax省市区三级联动
jdbc+servlet+ajax开发省市区三级联动 技术点:jdbc操作数据库,ajax提交,字符拦截器,三级联动 特点:局部刷新达到省市区三级联动,举一反三可以做商品分类等 宗旨:从实战中学习 博 ...
随机推荐
- Java枚举:小小enum,优雅而干净
<Java编程思想>中有这么一句话:“有时恰恰因为它,你才能够‘优雅而干净’地解决问题”——这句话说的是谁呢?就是本篇的主角——枚举(Enum)——大家鼓掌了. 在之前很长时间一段时间里, ...
- 使用chan的时候选择对象还是指针
使用chan的时候选择对象还是指针 今天在写代码的时候遇到一个问题,在创建一个通道的时候,不确定创建的通道是使用chan A还是chan *A. 思考了一下,觉得这个应该和函数一样是一个值传递还是参数 ...
- [开发技巧]·Numpy中对axis的理解与应用
[开发技巧]·Numpy中对axis的理解与应用 1.问题描述 在使用Numpy时我们经常要对Array进行操作,如果需要针对Array的某一个纬度进行操作时,就会用到axis参数. 一般的教程都是针 ...
- 补习系列(14)-springboot redis 整合-数据读写
目录 一.简介 二.SpringBoot Redis 读写 A. 引入 spring-data-redis B. 序列化 C. 读写样例 三.方法级缓存 四.连接池 小结 一.简介 在 补习系列(A3 ...
- 【我们一起写框架】MVVM的WPF框架(二)—绑定
MVVM的特点之一是实现数据同步,即,前台页面修改了数据,后台的数据会同步更新. 上一篇我们已经一起编写了框架的基础结构,并且实现了ViewModel反向控制Xaml窗体. 那么现在就要开始实现数据同 ...
- 4.2WebHost配置「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. WebHost配置 覆盖配置文件和修改启动URL 覆盖配置文件和修改启动URL是经常使用的地方,覆盖配置文件可以自 ...
- 【并发编程】Future模式及JDK中的实现
1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执 ...
- Java设计模式---Strategy策略模式
参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...
- 给萌新的Flexbox简易入门教程
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.sitepoint.com/flexbox-css-flexible-bo ...
- Android项目实战(五十三):判断网络连接是否为有线状态(tv项目适配)
一般对于android手机,我们可以通过sdk提供的方法判断网络情况 /** * 获取当前的网络状态 :没有网络-0:WIFI网络1:4G网络-4:3G网络-3:2G网络-2 * 自定义 * * @p ...