最近使用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. 2017"百度之星"程序设计大赛 - 资格赛 1002 度度熊的王国战略

    全局最小割 Stoer-Wagner (SW算法)优化 优化吃藕了,感谢放宽时限,感谢平板电视 (pb_ds) #include <iostream> #include <cstdi ...

  2. Linux IO模式以及select poll epoll详解

    一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...

  3. golang之工厂模式

    说明: golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题 如果包里面的结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决: ch1.go package ch1 type ...

  4. 【第一季】CH05_FPGA设计Verilog基础(二)Enter a post title

    [第一季]CH05_FPGA设计Verilog基础(二) 5.1状态机设计 状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路.通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态 ...

  5. layui upload 在JS动态加载内容后, 点击按钮无反应

    /** * 根据用户选择的不同规格选项 * 返回 不同的输入框选项 */ function ajaxGetSpecInput2(spec_arr) { var goods_id = $('#goods ...

  6. hdu 2680 Dijstra

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. Python集合的常用方法

    注释很详细 collection={,,"apple","orange","cat"} # 查看一个数是否在集合中 in print(&qu ...

  8. django form 和modelform样式设置

      目录 1.form通过attr设置属性 2.输入框设置表单状态 3.modelform的使用 4.结合modelform 使用for循环生成输入框 5.基于init构造方法设置样式 6.基本增删改 ...

  9. DevExpress VCL 19.2.3 Skin找不到皮肤

    The location where the DX Designtime Loader is looking for the skin packages has changed again ! For ...

  10. openstack 平台P2V迁移

    目录 [Openstack]P2V迁移 一.前言 二.前提准备 三.操作步骤 1.安装迁移中转机 2.配置中转机 3.创建存储池(可选) 4.制作virt-p2v的 U盘引导启动工具 5.操作物理机, ...