最近使用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。

记录 vant Picker 选择器,实现三级联动,传对应省市区code值的更多相关文章

  1. 三级联动查询全国省市区(xml与数据库)

    提供有china.xml和china.sql文件,实现全国省市区的三级联动效果 一.xml实现 import java.awt.EventQueue; import javax.swing.JFram ...

  2. 使用mint ui 的picker解决城市三级联动

    <mt-popup v-model="popupVisible" position="bottom"> <div class="po ...

  3. Select2实现的带搜索的省市区三级联动代码 设置默认初始值

    $(function() { $('#loc_province').select2('val','2456'); $('#loc_province').change(); $('#loc_city') ...

  4. Mint-UI Picker 三级联动

    Mint-UI Picker组件的三级联动 HTML: <mt-picker :slots="slots" value-key="name" @chang ...

  5. js封装的三级联动菜单(使用时只需要一行js代码)

    前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...

  6. JS省市区三级联动

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

  7. C# 基于Bootstrap的三级联动

    实现效果如图: 一.声明市.县.乡对应的下拉控件select <div class="form-group"> <label class="col-sm ...

  8. Vue如何使用vue-area-linkage实现地址三级联动效果

    很多时候我们需要使用地址三级联动,即省市区三级联动.网上有很多插件,在此介绍Vue的一款地区联动插件:vue-area-linkage,下面介绍如何使用这个插件实现地址联动效果:         1. ...

  9. 用mint-ui picker组件 实现省市区三级联动

    公司上一期项目中新增了省市区滑动三级联动效果,用的是mint-ui的picker组件和popup组件,效果如下:点击确定换地区,点击取消不变 省市区数据是后台给的(根据上一级的id,获取下一级数据列表 ...

随机推荐

  1. 【洛谷】P5348 密码解锁

    [洛谷]P5348 密码解锁 很显然我们可以推导出这个式子 设\(a(m)\)为\(m\)位置的值 \[ \mu(m) = \sum_{m | d} a(d) \\ a(m) = \sum_{m|d} ...

  2. python+selenium+webdriver+BeautifulSoup实现自动登录

    from selenium import webdriverimport timefrom bs4 import BeautifulSoupfrom urllib import requestimpo ...

  3. dos(cmd)命令大全(本文摘至于网络)

    命令简介 cmd是command的缩写.即命令行 .       虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在 ...

  4. 怎样实现跨域AJAX请求发送Cookie

    第一步: 服务器必须在Response Header中设置: Access-Control-Allow-Credentials: true 第二步: 客户端发起请求时需要将 xhr.withCrede ...

  5. 8-MySQL DBA笔记-测试基础

    第三部分 测试篇 测试需要掌握的知识面很广泛,本篇的关注点是数据库的性能测试和压力测试,对于其他领域的测试,由于涉猎不多,笔者就不做叙述了.DBA的工作职责之一就是评估软硬件,这往往是一项很耗时的工作 ...

  6. java关键知识汇总

    1.泛型理解 2.java或Java框架中常用的注解及其作用详解 3.三层架构和MVC的区别 4.jdk1.8手册(提取码:bidm) 5.Rocketmq原理&最佳实践 6.spring入门 ...

  7. zepto学习(一)之click事件和tap事件比较

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap分别 ...

  8. ASR测试方法---字错率(WER)、句错率(SER)统计

    一.基础概念 1.1.语音识别(ASR) 语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR), 狭隘 ...

  9. 12-factor应用和微服务架构应用的区别

    SAP云平台的帮助文档很多时候将12-factor应用和微服务架构的应用相提并论. 然而从Allan Beck和John Mcteague的Cloud成熟度模型概念里,12-factor应用从成熟度上 ...

  10. Spring的启动流程

    spring的启动是建筑在servlet容器之上的,所有web工程的初始位置就是web.xml,它配置了servlet的上下文(context)和监听器(Listener),下面就来看看web.xml ...