公司上一期项目中新增了省市区滑动三级联动效果,用的是mint-ui的picker组件和popup组件,效果如下:点击确定换地区,点击取消不变

省市区数据是后台给的(根据上一级的id,获取下一级数据列表,省列表传0),数据格式如下

接下来就直接上代码了

引入组件后的html部分

<mt-pop v-model="popupVisible" position="bottom" class="prop-tk">
<div class="clR pop-btn clearfix">
<p @click="cancle">取消</p>
<p @click="sureMap">确定</p>
</div>
<mt-picker ref="pickCom" :slots="slots" @change="onValuesChange" value-key="areaName"></mt-picker>
</mt-pop>

data里的slots数据和mint-ui格式一样

slots:[
{
flex: 1,
defaultIndex: 0,
values:[],
className: 'slot1',
textAlign: 'center',
}, {
pider: true,
content: '-',
// className: 'slot2'
}, {
flex: 1,
values:[],
className: 'slot3',
textAlign: 'center'
}, {
pider: true,
content: '-',
// className: 'slot4'
}, {
flex: 1,
values: [],
className: 'slot5',
textAlign: 'center'
}
],

页面加载时获取省市区数据(默认省和市是上个页面带过来的)

            this.$nextTick(() => {
// 获取省数据
_this.getPrevenceData(0).then(res=>{
_this.slots[0].values = res;
// 根据默认省获取要显示的省
res.forEach((item,index)=>{
// 上个页面传过来的省
if(item.areaName == _this.mrProvience){
_this.mrpId = item.id;
_this.slots[0].defaultIndex= index;
// 获取市数据
var cityList = _this.getPrevenceData(item.id);
// 根据默认市获取要显示的市
cityList.then(rescity =>{
// 给数据做缓存取消时用
_this.oldCityList =rescity;
_this.slots[2].values = rescity;
rescity.forEach((item,index)=>{
if(item.areaName == _this.showCity){
// 缓存id如果滑动时id变化才发请求
_this.mrcid = item.id;
_this.slots[2].defaultIndex= index;
// 获取区的数据
var quList = _this.getPrevenceData(item.id);
quList.then(resqu =>{
_this.oldQuList = resqu;
_this.slots[4].values = resqu;
_this.cityDataReady = true;
var valueArr = this.$refs.pickCom.getValues()
this.oldSlots = valueArr.concat();
})
}
})
})
}
})
})

城市滑动变化触发picker组件的change事件(id变化才发对应请求,否则会多次发请求)

onValuesChange(picker,values){
//判断如果省的id变化了,就去请求市和区,否则只请求区
if(this.cityDataReady){
//当省变化的时候,请求市和区
if(this.mrpId != values[0].id){
//请求市
this.getPrevenceData(values[0].id).then(res =>{
picker.setSlotValues(2,res);
this.mrpId = values[0].id;
this.mrcid = values[2].id;
})
}
//当市变化的时候,请求区
if(this.mrcid !=values[2].id){
//请求区,当仅仅是区变化的时候,不需要发任何请求
this.getPrevenceData(values[2].id).then(res =>{
picker.setSlotValues(4,res);
this.mrpId = values[0].id;
this.mrcid = values[2].id;
})
}
} },

点击确定缓存当前数据

sureMap(){
this.popupVisible = false;
// 获取变换后的城市数据
var valueArr = this.$refs.pickCom.getValues()
this.oldSlots = valueArr.concat();
this.oldCityList = this.$refs.pickCom.getSlotValues(2);
this.oldQuList = this.$refs.pickCom.getSlotValues(4)
},

点击取消时把缓存的数据赋值给picker组件

cancle(){
_this.popupVisible = false;
  // 把缓存的数据赋值给对应的slot
_this.$refs.pickCom.setSlotValues(2,_this.oldCityList);
_this.$refs.pickCom.setSlotValues(4,_this.oldQuList);
_this.$refs.pickCom.setValues(this.oldSlots);
}

在做这个功能时出现的问题主要有2个,一个是change时多发请求问题,第二个就是取消时还要回到原来的数据(因为组件默认change之后自动就变了)

还好后来问题都解决了

用mint-ui picker组件 实现省市区三级联动的更多相关文章

  1. 记录 vant Picker 选择器,实现三级联动,传对应省市区code值

    最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...

  2. vue仿京东省市区三级联动选择组件

    工作中需要一个盒京东购物车地址选择相似的一个省市区三级联动选择组件,google查了下都是下拉框形式的,于是自己写了一个,希望对使用vue开发项目的朋友有帮助,显示效果如下:使用vue2.0开发 ht ...

  3. Android中使用开源框架citypickerview实现省市区三级联动选择

    1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...

  4. PHPOffice/PHPExcel生成省市区三级联动的excel表格

    最近公司需要用到一个省市区三级联动的excel表格,但是数据都在数据库,又太多,人工不好制作,就让我这个phper来帮忙啦. 主要用到的是excel的定义名称,数据验证.其中数据验证的列表只能是一列或 ...

  5. 用jsp实现省市区三级联动下拉

    jsp+jquery实现省市区三级联动下拉 不少系统都需要实现省市区三级联动下拉,像人口信息管理.电子商务网站.会员管理等,都需要填写地址相关信息.而用ajax实现的无刷新省市区三级联动下拉则可以改善 ...

  6. laraveladmin省市区三级联动

    Distpicker是一个中国省市区三级联动选择组件,这个包是基于Distpicker的laravel-admin扩展,用来将Distpicker集成进laravel-admin的表单中 安装 com ...

  7. jQuery省市区三级联动插件

    体验效果:http://hovertree.com/texiao/bootstrap/4/支持PC和手机移动端. 手机扫描二维码体验效果: 代码如下: <!DOCTYPE html> &l ...

  8. 省市区三级联动 pickerView

    效果图 概述 关于 省市区 三级联动的 pickerView,我想大多数的 iOS 开发者应该都遇到过这样的需求.在遇到这样的需求的时候,大多数人都会觉的这个很复杂,一时无从下手.其实真的没那么复杂. ...

  9. JS省市区三级联动

    不需要访问后台服务器端,不使用Ajax,无刷新,纯JS实现的省市区三级联动. 当省市区数据变动是只需调正js即可. 使用方法: <!DOCTYPE html><html>< ...

随机推荐

  1. PDO连接数据库-Xmodel

    <?php/* * Copyright (c) 2018, 北京博习园教育科技有限公司 * All rights reserved. * * 文件名称: xmodel.php * 摘 要: 模型 ...

  2. Oracle 创建表 Create Table...

    一.创建表 主键约束primary key 约束条件,唯一且非空,一个表中只能有一个主键:有多个字段联合作为主键时,合在一起唯一标识记录,叫做联合主键. 外键约束 foreign key 受另外一张表 ...

  3. mysql winx64安装配置方法

    1.mysql-5.7.21-winx64.zip解压到自己指定的路径  2.自己新建Data文件夹和my.ini文件 my.ini内容,直接复制修改路径即可 my.ini需要保存为ANSI格式 ,否 ...

  4. MongoDB数据导出

    在bin目录下(没有设置环境变量), mongoexport -d Structure_Patents_infos -c patents_texts -o D:\Postgraduate\Python ...

  5. C#遍历枚举(Enum)值

    foreach (object o in Enum.GetValues(typeof(EmpType))) { Console.WriteLine("{0}:{1}", o, En ...

  6. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  7. JavaScript基础知识(DOM)

    获取元素的方法 要操作谁,就要先获取谁: 获取元素 1.document.getElementById:通过ID名来获取元素 兼容性: 在IE8以下,会默认把name属性当做id来获取: docume ...

  8. 【转】前端框架天下三分:Angular React 和 Vue的比较

    前端框架天下三分:Angular React 和 Vue的比较 原文链接:http://blog.csdn.net/haoshidai/article/details/52346865 前端这几年的技 ...

  9. Jenkins+Jmeter持续集成笔记(一:环境准备)

    整体思路: 通过Jmeter图形界面编写api测试脚本 ant 批量执行Jmeter脚本文件 将其集成到jenkins,设置执行频率与发送测试报告 运行环境 系统 配置 IP Centos7.1 1核 ...

  10. Python3学习之路~5.11 configparser模块

    用于生成和修改常见配置文档,当前模块的名称在 python 2.x 版本中为 ConfigParser, python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式 ...