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

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

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

看了一下vant UI提供的api有提供 Picker 选择器的api,哇,心里美滋滋,但是我api提供的只有二级联动,我****,没事凭我的本事,琢磨个一两个月还不是问题的,哈哈。

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。

原文地址:https://www.cnblogs.com/liangziaha/p/12082855.html

时间: 2024-08-09 07:36:35

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

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

提供有china.xml和china.sql文件,实现全国省市区的三级联动效果 一.xml实现 import java.awt.EventQueue; import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JComboBox;import javax.swing.JLabel; import org.dom4j.Attribute;i

【修改】纯JS省市区三级联动 支持js默认省市区

---恢复内容开始--- <!DOCTYPE html><html><head><title>修改,QQ JS省市区三级联动 -支持默认省市区</title><!-- 使用QQ的省市区数据 --><!--<script type="text/javascript" src="http://ip.qq.com/js/geo.js"></script>--><

js实现省市级三级联动

之前做一个小项目时碰到了这个地域选择,三级联动的问题,找了很多源码,最后筛选出了我认为比较实用的代码,分享给大家. 首先,html文件应该有这样的select <select id="province" class="province"></select> <select id="city" class="city"></select> <select id="a

JS省市区三级联动

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

MVC 三级联动

本篇实现中国省市区三级联动,先看最终效果: 初始状态: 当选择第1个Select,第2.3个Select可供选择: 当选择第2个Select,第1个不变.第3个Select可供选择: 当选择第3个Select,第1.2个不变: 下面是代码: 控制器Controllers\HomeController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste

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

很多时候我们需要使用地址三级联动,即省市区三级联动.网上有很多插件,在此介绍Vue的一款地区联动插件:vue-area-linkage,下面介绍如何使用这个插件实现地址联动效果: 一.安装 // v5之前的版本 npm i --save vue-area-linkage // v5及之后的版本 npm i --save vue-area-linkage area-data or yarn // v5之前的版本 yarn add vue-area-linkage // v5及之后的版本 yarn

省市区三级联动 用ajax实现

数据库dt_area中表的数据结构: html代码部分: 省:<select name="" id="sheng" onChange="selshi(this)"> <option value="">请选择</option> </select> 市:<select name="" id="shi" onChange="sel

时间和地域三级联动选择器(Android-PickerView-master)

先附上下载和效果展示地址 https://github.com/saiwu-bigkoo/Android-PickerView 之后说一下程序依赖后会遇到的问题Error:(2, 0) Plugin with id 'com.github.dcendents.android-maven' not found. 解决办法在Project下的build.gradle中添加两句 classpath 'com.github.dcendents:android-maven-gradle-plugin:1.

ios收货地址三级联动选择

这次的需求,是省市区三级联动选择,并且市的选择要根据省的id,然后区的选择要根据市的id 每次都要进行网络请求,关键代码,其实是 //监听轮子的移动 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component; 然后我就上传我的代码,这个代码我也是根据别人的修改的,因为需求不一样 1,创建一个View // //  IWAreaPickerVi