使用Picker写出地区选择,选省市区

本文章代码,借鉴了别人博客的内容,然后根据自己的修改,做了调整,原文:uni-app省市区地址选择器 - 前端—小白 - 博客园

第一步:封装一个地区选择器组件,命名为my-picker.vue

html部分:

<view class="my-picker">
        <picker @change="bindPickerChange" 
        @columnchange="columnchange" 
        :range="array" 
        range-key="name" 
        :value="value" 
        mode="multiSelector">
        <slot></slot>
        </picker>

</view>

js部分:

<script>
let selectVal = ['', '', ''];
export default {
    data() {
        return {
            value: [0, 0, 0],   //value 每一项的值表示选择了 range 对应项中的第几个(下标从 0 开始)
            array: [],
            selected: [0, 0, 0], //被选择的城市id:省id,市id,区id
            index: 0,
            allAddress: []
        };
    },
    created() {},

    mounted() {
        this.getAreaList();
        setTimeout(() => {
            this.initSelect();
        }, 1000);
    },
    methods: {
        // 初始化地址选项
        initSelect() {
            this.updateSourceDate() // 更新源数据
                .updateAddressDate() // 更新结果数据
                .$forceUpdate(); // 触发双向绑定
        },
        // 地址控件改变控件
        columnchange(d) {
            this.updateSelectIndex(d.detail.column, d.detail.value) // 更新选择索引
                .updateSourceDate() // 更新源数据
                .updateAddressDate() // 更新结果数据
                .$forceUpdate(); // 触发双向绑定
        },
        // 更新源数据
        updateSourceDate() {
            let that = this;
            this.array = [];
            this.array[0] = this.allAddress.map(obj => {
                return {
                    name: obj.name,
                    id: obj.id
                };
            });

            this.array[1] = this.allAddress[this.value[0]].children.map(obj => {
                return {
                    name: obj.name,
                    id: obj.id
                };
            });
            this.array[2] = this.allAddress[this.value[0]].children[this.value[1]].children.map(obj => {
                return {
                    name: obj.name,
                    id: obj.id
                };
            });
            return this;
        },
        //更新索引
        updateSelectIndex(column, value) {
            let arr = JSON.parse(JSON.stringify(this.value));
            console.log(arr, 'arr');
            arr[column] = value;
            if (column === 0) {
                arr[1] = 0;
                arr[2] = 0;
                this.selected[0] = this.array[column][value].id;
            }
            if (column === 1) {
                arr[2] = 0;
                this.selected[1] = this.array[column][value].id;
            }
            if (column === 2) {
                this.selected[2] = this.array[column][value].id;
            }
            this.value = arr;
            return this;
        },
        // 更新结果数据
        updateAddressDate() {
            selectVal[0] = this.array[0][this.value[0]].name;
            selectVal[1] = this.array[1][this.value[1]].name;
            selectVal[2] = this.array[2][this.value[2]].name;
            return this;
        },

        //点击确定
        bindPickerChange(e) {
            this.$emit('change', {
                index: this.value,
                data: selectVal,
                selected: this.selected
            });
            return this;
        },
        // 获取地区
        getAreaList() {
            let that = this;

//网络请求,获取城市数据
            this.$api.getAreaList({}, res => {
                if (res.code == 200) {
                    that.allAddress = res.data;
                    that.allAddress.unshift({ name: '请选择', id: 0, children: [] });
                    that.allAddress.map(el => {
                        el.children.unshift({ name: '请选择', id: 0, children: [] });
                        if (el.children != null) {
                            el.children.map(item => {
                                if (item.children != null) {
                                    item.children.unshift({ name: '请选择', id: 0, children: [] });
                                }
                            });
                        }
                    });
                }
            });
        },
        onchange(e) {
            const value = e.detail.value;
        }
    }
};
</script>

城市数据allAddress:[{name:"北京",id:1,children:[{name:"北京市",id:12,children:[name:"东城区",id:112]}]}]类似这种

第二步:导入的你所需要显示地区的组件中。

效果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值