最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动。

但是 突然遇到一个线上产品要传的省市区的code码,还和vant的 邮编不一样,我*****。

看了一下vant UI有提供 Picker 选择器的api,哇,心里美滋滋,但是api提供的三级联动没有传对应的code,我****,没事凭我的本事,琢磨个几天还不是问题的,哈哈。

vant Picker 选择器

开始======================>

首先看一下接口返回的数据结构吧,省市区三级联动,每一级都带的有code。

然后根据 vant Picker 选择器的api 开写。

虽然vant Picker 选择器的api,只提供了二级,但是我们可以模仿这写一下三级。

上代码


<template>
    <div class="user-login">
        <van-field
        readonly
        clickable
        label="城市"
        placeholder="选择城市"
        @click="showPicker = true"
        />
        <van-popup v-model="showPicker" position="bottom">
            <!-- vant Picker 根据 绑定的columns数据,来渲染几级联动,这里我们使用的是三级联动 -->
            <van-picker v-if="pageShow" show-toolbar :columns="columns" @cancel="onCancel"
  @confirm="onConfirm" @change="onChange" :item-height="35" />
        </van-popup>
    </div>
</template>
<script>
import Vue from 'vue';
import { Picker } from 'vant';
Vue.use(Picker);
import api from "../fetch/api";
export default {
    name:"user-login",
    data(){
        return {
            // columns 为三个,即渲染出来的就是三级联动。
            columns: [
                {
                    values: '',
                    className: 'column1'
                },
                {
                    values: '',
                    className: 'column2',
                    defaultIndex: 0
                },
                {
                    values: '',
                    className: 'column3',
                    defaultIndex: 0
                }
            ],
            pageShow:false, //省市区三级联动是否显示(因为是接口返回的数据,等省市区数据渲染完毕之后,在显示三级联动)
            cityDates:'', //安联当前选中市的所有区所有数据
            showPicker:false, //vant Popup弹出框显示隐藏
            data:'',//接口返回所有省市区数据
        }
    },
    beforeCreate(){
     //这里不要在意 是我们接口的签名。
        var args1 = this.sign({});
        // 接口请求数据
        api.getAnLianArea(args1).then(res => {
            this.data = res.anLianAreaList;
            // 默认展示一级的数据
            this.columns[0].values = Object.values(res.anLianAreaList).map(function(e){
                return {text:e.name,code:e.code}
            })
            // 默认展示二级的数据
            this.columns[1].values = Object.values(res.anLianAreaList[0].anLianCityList).map(function(e){
                return {text:e.name,code:e.code}
            })
            // 默认展示三级的数据
            this.columns[2].values = Object.values(res.anLianAreaList[0].anLianCityList[0].anLianCountyList).map(function(e){
                return {text:e.subcityNameZhs,code:e.subcityCode}
            })
            // 等待dom渲染完毕之后,在去显示 三级联动。
            this.$nextTick(function(){
                this.pageShow = true;
            })
        });
    },
    mounted(){
    },
    methods:{
        // vant picker选择器回调
        onChange(picker, values,index) {
            // 这里我有可能渲染的有问题,导致回调每次都修改了当前列,其他值没有修改,当前列??(当前列什么鬼呀,什么垃圾啊???) 解释一下 ↓↓
            // 因为vant的 van-picker 回调只会返回你修改的那一列,比如现在为 [北京,北京,东城区],你修改了省为[天津市,天津市,和平区],但是vant的change回调会得到[天津市,北京,东城区],后面两个在回调中没有修改,不知道我的渲染方法有问题还是什么问题。
            // 所以我在这里判断change事件触发后,如果你修改了省份的话,回调里面省份会改变,但是市和区还是上一个省份的 市和区,这时我们执行回调修改省,市,区的时候,因为回调只有省改变了,市和区DOM改变了,但是回调里面没改变的问题(不晓得什么问题),这时我们去找省下面的 市,我们取回调的市名称,如果在省下面没有找到这个市,默认展示第一个市,区也默认展示第一个市下面的区,如果遍历市能查到,就去展示对应的市。
            console.log(picker, values,index);
            // 回调时修改第2列数据
            picker.setColumnValues(1, this.cityDate(this.data,values[0].text));
            // 回调时修改第3列数据
            picker.setColumnValues(2, this.county(this.data,values[1].text));
        },
        // 修改市 这里不再多说什么了根据自己的数据格式来
        cityDate(data,province){
            var that = this;
            data.forEach(function(res){
                if(res.name == province){
                    console.log(res)
                    that.cityDates =  res;
                }
            });
            
            return that.cityDates.anLianCityList.map(function(res){
                return {text:res.name,code:res.code};
            })
            // return 返回数据格式,因为我需要省市区code,所以我return的格式是对象,例:[{text:'北京市',code:'1'},{text:'河南省',code:'2'},...],如果你不需要code直接这样就可以 例['北京市','河南省',.....]
        },
        // 修改县 这里不再多说什么了根据自己的数据格式来
        county(data,county){
            var that = this;
            var countyDate = '';
            // 因为vant的 van-picker 回调只会返回你修改的那一列,比如现在为 [北京,北京,东城区],你修改了省为[天津市,天津市,和平区],但是vant的change回调会得到[天津市,北京,东城区],后面两个在回调中没有修改,不知道我的渲染方法有问题还是什么问题。
            // 所以我在这里判断change事件触发后,如果你修改了省份的话,回调里面省份会改变,但是市和区还是上一个省份的 市和区,这时我们执行回调修改省,市,区的时候,因为回调只有省改变了,市和区DOM改变了,但是回调里面没改变的问题(不晓得什么问题),这时我们去找省下面的 市,我们取回调的市名称,如果在省下面没有找到这个市,默认展示第一个市,区也默认展示第一个市下面的区,如果遍历市能查到,就去展示对应的市。
            that.cityDates.anLianCityList.forEach(function(res){
                if(res.name == county){
                    countyDate =  res;
                }
            });
            // 这里如果没有找到对应的县
            if(countyDate == ''){
                countyDate = that.cityDates.anLianCityList[0];
            }
            // return 县
            return countyDate.anLianCountyList.map(function(res){
                return {text:res.subcityNameZhs,code:res.subcityCode};
            })
            // return 返回数据格式,因为我需要省市区code,所以我return的格式是对象,例:[{text:'北京市',code:'1'},{text:'河南省',code:'2'},...],如果你不需要code直接这样就可以 例['北京市','河南省',.....]
        },
        onConfirm(val,a){
            console.log(val)
        },
        onCancel(){
            this.showPicker = false;
        },
    }
}
</script>

 

有大佬知道为什么,vant Picker回调为什么,dom渲染了,但回调只修改了当前列的数据(是不是我渲染的有问题)

上面代码可以实现 三级联动 传 code。

最新文章

  1. 简介python2.x的编码
  2. 将string转换成char* (转)
  3. CLR via C# 3rd - 02 - Building, Packaging, Deploying, and Administering Applications and Types
  4. 表示即将废弃一个方法,或不赞成使用的一个方法或属性或其它,关键词 deprecated
  5. [转] AIX lv 4k偏移量
  6. 题目一:打印出所有的 &quot;水仙花数 &quot;,所谓 &quot;水仙花数 &quot;是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 &quot;水仙花数 &quot;,因为153=1的三次方+5的三次方+3的三次方。
  7. URL参数GB2312和UTF-8编码 自动识别
  8. 打包时Xcode报:此证书的签发者无效Missing iOS Distribution signing identity
  9. IIS7 php wordpress 中文url 标签tag中文URL404解决方法
  10. php构造函数,引入数据库操作类函数
  11. 根据用户输入的二代身份证号码自动为其计算生成出生日期的javascript方法
  12. 谷歌下设置滚动条的css样式
  13. js中的call及apply的运用
  14. codevs 1817 灾后重建
  15. myPagination5.0 分页简单实例
  16. XML的DTD约束
  17. UVA 1622 Robot
  18. background:rgba() 兼容ie8 用法
  19. 微信支付 chooseWXPay:fail
  20. 例10-7 uva10820(欧拉)

热门文章

  1. Junit测试类中如何调用Http通信
  2. java 自带 http get/post 请求
  3. Centos7下,宿主机nginx配合docker环境的php-fpm
  4. fontmin字体子集
  5. vim 插件 入门
  6. Java多线程(九):生产者消费者模型
  7. linux脚本监控应用且通过邮件报警异常
  8. java lesson10homework
  9. C# WebForm 屏蔽输入框的验证
  10. 使用高德地图JS获取当前位置和经纬度