記錄 vant Picker 選擇器,實現三級聯動,傳對應省市區code值


 

 

 

 

<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>

 

轉載 https://www.cnblogs.com/liangziaha/p/12082855.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM