又双叒一个uniapp组件

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

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

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

依然发布到了插件市场:http://ext.dcloud.net.cn/plugin?id=708

看一下效果吧

具体实现

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

第一、底部弹出框

<view class="popup-layout-wrap" :class="popuplayoutClass" >
<view class="popup-layout-content" :class="popupContentClass" :style="[{height:height}]">
<slot>
</slot>
</view>
<view v-if="maskShow" class="popup-layout-mask" @tap="close(maskClick)"></view>
</view>

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

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

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

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

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

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

html代码

        <view class="link-address-wrap">
<view class="link-adress-content">
<view class="head-wrap">
<text class="cancel" @click="btn_cancel">取消</text>
<text class="confirm" @click="btn_confirm">确认</text>
</view>
<view class="head-selected">
<text class="selected-txt">已选择:{{selected_address}}</text>
</view>
<view class="operation-wrap">
<view class="operation-container">
<view class="operation-content">
<scroll-view
scroll-y="true"
class="province"
show-scrollbar="false">
<view
:class="{'province-txt':index!==province_current,'province-txt-click':index===province_current}"
@click="province_txt_click(items.id)"
v-model="items.id"
v-for="(items , index) of linkAddress_province"
>
{{items.name}}
<view class="pic" v-show="index===province_current">
<image src="../../static/xuan-linkAddress/yes.png"></image>
</view>
</view>
</scroll-view>
</view>
<view class="operation-content">
<scroll-view
scroll-y="true"
class="province"
show-scrollbar="false">
<view
:class="{'province-txt':index!==city_current,'province-txt-click':index===city_current}"
@click="city_txt_click(items.id)"
v-model="items.id"
v-for="(items , index) of linkAddress_city"
>
{{items.name}}
<view class="pic" v-show="index===city_current">
<image src="../../static/xuan-linkAddress/yes.png"></image>
</view>
</view>
</scroll-view>
</view>
<view class="operation-content">
<scroll-view
scroll-y="true"
class="province"
show-scrollbar="false">
<view
:class="{'province-txt':index!==district_current,'province-txt-click':index===district_current}"
@click="district_txt_click(items.id)"
v-model="items.id"
v-for="(items , index) of linkAddress_district"
>
{{items.name}}
<view class="pic" v-show="index===district_current">
<image src="../../static/xuan-linkAddress/yes.png"></image>
</view>
</view>
</scroll-view>
</view>
</view>
</view>
</view>
</view>

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

分为 未点击样式和点击样式。通过点击元素的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 default class 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=new Request(); export default{
//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';

export default {
/*
*_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);//回掉
}
}
});
}
}

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

<!-- html-->
<!-- 用于弹出底部框-->
<button class="popup-btn" @tap="popup_bottom()">请选择</button>
<!-- 选择组件 -->
<linkAddress
ref="linkAddress"
:height="height"
@confirmCallback="confirmCallback()"
>
</linkAddress> <!-- js-->
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;
}
}

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

GitHub地址:https://github.com/steffenx/uniapp_linkaddress

uniapp自定义简单省市区联动组件的更多相关文章

  1. uniapp自定义简单弹窗组件

    2.0(2019-08-31) 船新版本的信息弹窗组件 插件市场地址:http://ext.dcloud.net.cn/plugin?id=672 可以弹出很多条信息,并单独控制消失时间.点击消失. ...

  2. element-ui 省市区联动组件 el-cascader

    <el-form-item label="省市 :" prop="description"> <el-cascader size=" ...

  3. uniapp自定义picker城市多级联动组件

    uniapp自定义picker城市多级联动组件 支持多端--h5.app.微信小程序.支付宝小程序... 支持自定义配置picker插件级数 支持无限级 注意事项:插件传入数据格式为children树 ...

  4. SharePoint 2010 自定义 字段 类型--------省市区联动

    转:http://www.cnblogs.com/sp007/p/3384310.html 最近有几个朋友问到了有关自定义字段类型的问题,为了让更多的人了解自定义字段类型的方法,特写一篇博客与大家分享 ...

  5. 转载:SharePoint 2010 自定义 字段 类型--------省市区联动

    最近有几个朋友问到了有关自定义字段类型的问题,为了让更多的人了解自定义字段类型的方法,特写一篇博客与大家分享,首先看一下解决方案目录 创建自定义类型分以下几个步骤: 第一步:添加SharePoint映 ...

  6. uni-app自定义Modal弹窗组件|仿ios、微信弹窗效果

    介绍 uniapp自定义弹窗组件uniPop,基于uni-app开发的自定义模态弹窗|msg信息框|alert对话框|confirm确认框|toast弱提示框 支持多种动画效果.多弹窗类型ios/an ...

  7. 基于uniapp自定义Navbar+Tabbar组件「兼容H5+小程序+App端Nvue」

    uni-app跨端自定义navbar+tabbar组件|沉浸式导航条|仿咸鱼凸起标签栏 在跨端项目开发中,uniapp是个不错的框架.采用vue.js和小程序语法结构,使得入门开发更容易.拥有非常丰富 ...

  8. JS省市区联动效果

    省市区联动下拉效果在WEB中应用非常广泛,尤其在电商网站最为常见.一般使用Ajax实现无刷新下拉联动.利用jQuery,通过读取JSON数据,实现无刷新动态下拉省市二(三)级联动效果. 首先我们可以看 ...

  9. 基于AngularJs + Bootstrap + AngularStrap 省市区联动实践

    什么是 AngularJs?网上一大堆资料,没能真正说明白. AngularJs 就是一个函数库,算不上一个框架,源码2万2千多行,提供了前端MVC的开发方式, 有双向绑定,指令等特性,这是具有革命性 ...

随机推荐

  1. Java学习成长第一集

    由于最近所在项目组的项目临近结尾,所以有时间对自己近来的学习做个总结.不得不说,程序员不学习就退步这句话是真的很让人信服!自己入行将近一年的时间,所学的就是Java开发的专业,很羞愧的是现在的自己能力 ...

  2. AJ学IOS(21)UIApplication设置程序图标右上⾓红⾊数字_联⺴指⽰器等

    AJ分享,必须精品 效果简介 UIApplication的运用,有很多相如:进⾏行⼀一些应⽤用级别的操作等等,打开网页,打开电话拨号和信息等.. 什么是UIApplication ● UIApplic ...

  3. 2019-08-01【机器学习】有监督学习之分类 KNN,决策树,Nbayes算法实例 (人体运动状态信息评级)

    样本: 使用的算法: 代码: import numpy as np import pandas as pd import datetime from sklearn.impute import Sim ...

  4. Ant安装与配置

    1. 到apache 官网去下载最新版本的ant,http://ant.apache.org/:下载后直接解压缩到电脑上,不需要安装: 2.环境变量配置: 2.1 ->计算机右键->属性- ...

  5. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  6. Windows环境下搭建Cocos2d-x3.2环境并配置android交叉编译环境

    一.软件 1)VS2012(C++11特性在VS2012以上可以使用):传送门: 2)Cocos2d-x官网源码:传送门:http://cocos2d-x.org/download 3)JDK:传送门 ...

  7. C++头文件问题

    自己定义的头文件必须要用“***.h”系统头文件必须要用<***.h>stdafx.h 必须放在所有头文件的最前面(如果不放,debug版本没有问题:release版本有问题,会报错)

  8. iview使用之怎样通过render函数在tabs组件中添加标签

    在实际项目开发中我们通常会遇到一些比较'新颖'的需求,而这时iview库里往往没有现成可用的组件示例,所以我们就需要自己动手翻阅IviewAPI进行自定义一些组件,也可以说是将iview库里的多种组件 ...

  9. Java中Character类

    Character 类在对象中包装一个基本类型char的值此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等),并将字符从大写转小写,反之亦然. 构造方法: Character(char ...

  10. 15分钟从零开始搭建支持10w+用户的生产环境(三)

    上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二)   三.WebServer 在SOA和gRPC大行其 ...