uniapp城市列表_uniapp自定义简单省市区联动组件

本文介绍如何在uniapp中实现一个简单的省市区联动选择器组件,利用网络请求获取城市数据,结合Vuex进行数据共享,使用LuPopupWrapper作为底部弹窗。详细讲述了组件的布局、数据处理和网络请求过程。
摘要由CSDN通过智能技术生成

又双叒一个uniapp组件

最近有一个选择地址的需求,就写了一个省市区联动选择器。

选择日期使用的picker,就照着它简单的整了一个,使用网络请求城市数据,还用到了vuex组件数据共享。

本来自己整了一个底部弹窗,又在插件市场看到了更好的底部弹窗 :LuPopupWrapper--弹窗容器, 所以就用了这个。

看一下效果吧

具体实现

css就不贴出来了,下载可以看到。

第一、底部弹出框

这里的底部弹出框用了插件市场的,简单的看一下布局。

slot插槽用于填充弹出框的内容。

最主要的就是弹出和关闭。属性就一个height,控制弹出的高度,其他的暂时不需要。

第二、上下滑动选择城市信息

分析一波:头部两个按钮,取消和确定。头部下面是选择的城市信息展示。再往下就是最重要的选择操作区。

选择操作区分成三列,三列分别显示省市区,并且可滑动。当点击选择后,变为红色。

html代码

取消

确认

已选择:{{selected_address}}

>{{items.name}}

>{{items.name}}

>{{items.name}}

其他的都不用说了,重要的是循环这里。

分为 未点击样式和点击样式。通过点击元素的index和id匹配来切换状态。

需要定义的变量

data(){return{/*省市区选择计数*/province_current:null,

city_current:null,

district_current:null,/*省市区循环数据*/linkAddress_province: [],

linkAddress_city: [],

linkAddress_district: [],/*请求提交的*/submission:{

province:'',//省

city:'',//市

county:'',//区

town:''//镇

},/*用户选择的地址*/user_address:{

province:'',//省

city:'',//市

district:''//区

},

selected_address:''};

},

弹窗显示的时候,去请求省的数据。点击省后请求对应省份的市。

js代码 只展示点击省的操作,其他的差不多

//省点击选择

province_txt_click(target){//区数据值为空

this.linkAddress_district=[];//市、区的选择计数置为null

this.city_current=null;this.district_current=null;

let province;//得到点击的数据,改变样式

for (let i = 0; i < this.linkAddress_province.length; i++) {if (this.linkAddress_province[i].id ===target) {this.province_current =i;

province=this.linkAddress_province[i].name;break;

}

}//用户选择

this.user_address={

province:province,

city:'',

district:''}//请求提交的数据先置为空

this.submission={

province:'',

city:'',

county:'',

town:''};//再赋值

this.submission.province=target;this.selected_address=this.user_address.province;//请求市数据

linkAddress_p.get_linkAddress(this,"city",this.submission,(revert)=>{

});

},

第三、网络请求

看官方文档的网络请求后封装一下

//网络请求

export defaultclass Request{/**paramete 拼接参数

* data 参数值

* method 请求方式*/http(paramete,data,method){//根地址

let BASE_API="http://admin.farmereasy.com";return new Promise((resolve,reject)=>{

uni.request({

url:`${BASE_API}${paramete}`,

data:data,

method:method,

success:(res)=>{

resolve(res);

},

fail:(res)=>{

resolve(0);

}

})

});

}

}

import Request from "@/static/xuan-linkAddress/request.js"

//创建Request对象

let request=newRequest();

exportdefault{//data 参数值

get_linkAddress_api:function(data){

console.log(data);return request.http('/api/address/area',data,'GET');

}

}

通过传入不同标签赋给不同的变量。

import api from '@/components/xuan-linkAddress/api.js';

exportdefault{/**_this:全局this

* data:数据(参数)

* callback:回掉页面*/get_linkAddress:function(_this,tag,data,callback) {//请求

api.get_linkAddress_api(data).then((res) =>{

let revert=res.data.data;

console.log(revert)if(res.data.code==1){if(tag==="province"){

console.log("province")

_this.linkAddress_province=revert;

callback(true);//回掉

}if(tag==="city"){

console.log("city")

_this.linkAddress_city=revert;

callback(true);//回掉

}if(tag==="district"){

console.log("district")

_this.linkAddress_district=revert;

callback(true);//回掉

}

}

});

}

}

组件就完成了,在具体的页面使用

请选择

ref="linkAddress":height="height"@confirmCallback="confirmCallback()"

>

import linkAddress from'../../components/xuan-linkAddress/xuan-linkAddress.vue'components:{

linkAddress

},

methods: {popup_bottom:function() {this.height = '550rpx';//显示

this.show_popup();

},show_popup:function() {this.$refs.linkAddress.show();

},confirmCallback:function() {//从vuex中取到用户选择的数据

//let ads=this.$store.state.user_address;

//this.address=ads.province+ads.city+ads.district;

}

}

最后:很简单的一个组件,刚刚开始,希望大家多多包涵,共同学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值