产品老哥对项目再一次进行关爱, 新增页面, 新增需求, 很完美........

不多说, 记录一下新增东西中的省市区联动选择, (这里全国地区信息是在本地, 但不建议这么做, 因为js文件太大.. 建议使用插件, 或者后台将地区信息返回前台)

先看一下效果图

全国地区信息js文件(链接打开另存为即可) https://files.cnblogs.com/files/yk95/data.js ; 

page页面 (页面中-- margin-t, bgc-f, ...等等是项目中公共样式,  这里写在页面样式中了 )

 <template>
<view id="AddressAction">
<view class="addressBox margin-t">
<view class="name addressItem bgc-f border-b display-flex">
<view class="left c-333 ">收货人</view>
<input type="text" placeholder-class="placeholder" placeholder="请填写收货人姓名"></input>
</view>
<view class="phone addressItem bgc-f border-b display-flex">
<view class="left c-333">手机号</view>
<input type="text" maxlength="11" placeholder="请填写11位手机号"></input>
</view>
<view class="address addressItem bgc-f border-b display-flex" @tap.stop="selecteHandle">
<view class="left c-333">省市区</view>
<view class="right">
<text>{{areaInfo}}</text>
<text class="iconfont icon-arrow-right c-gray-time font-s26"></text>
</view>
</view>
<view class="address_detail addressItem bgc-f border-b display-flex">
<view class="left c-333">详细地址</view>
<input class="flex-1" type="text" placeholder="街道、楼牌号等"></input>
</view>
</view>
        <!-- 这里使用组件 组件传值以及组件通信-->
<selectedAddressView :isShow.sync="isShow" :provinces.sync="provinces" :citys.sync="citys" :areas.sync="areas" :value.sync="value"
@cancel.user="cancelHandle" @sure.user="sureHandle"></selectedAddressView>
<view></view>
</view>
</template>
<script>
import wepy from 'wepy';
import address from '@/utils/data'; //引入全国地区信息js文件
import selectedAddressView from '@/components/selectedAddress'; //引入三级联动组件
export default class sAddressAction extends wepy.page{
config = {
navigationBarTitleText: ""
}
components = {
selectedAddressView //声名组件
}
data = {
isShow: false, // 三级联动组件是否可见 ,组件传值
value: [0, 0, 0], // 对应 picker-view中change()事件中的e.detail.value, 用来做判断; 组件传值
provinces: [], //所有省份 provinces; 组件传值
citys: [], // 选择省对应的所有市; 组件传值
areas: [], // 选择市对应的所有区; 组件传值
areaInfo: '', //点击确定是选择的地址信息
}
init() { //初始化三级联动信息
let that = this;
let id = address.provinces[0].id; //默认联动显示北京
that.provinces = address.provinces;
that.citys = address.citys[id];
that.areas = address.areas[address.citys[id][0].id];
}
onLoad() {
this.init();
}
methods = {
selecteHandle() {
this.isShow = true;
this.$apply();
},
cancelHandle() {
this.isShow = false;
this.$apply();
},
sureHandle(areaInfo) {
this.isShow = false;
this.areaInfo = areaInfo;
this.$apply();
} }
}
</script>
<style lang="less">
.addressItem{
padding: 0 54rpx 0 48rpx;
.left{
width: 126rpx;
height: 100rpx;
line-height: 100rpx;
margin-right: 20rpx;
}
.right{
width: 100%;
height: 100rpx;
line-height: 100rpx;
text-align: right;
}
input{
text-align: right;
width: 100%;
height: 100rpx;
line-height: 100rpx;
font-size: 32rpx;
}
}
.margin-t{ margin-top: 20rpx; }
.bgc-f { background-color: #ffffff }
.border-b { border-bottom: 1px solid #999999; }
.display-flex{ display: flex; }
.flex-1{ flex: 1; }
.c-333 { color: #333333; }
.c-gray-time { color: #999999; }
.font-s26 { font-size: 26rpx; }
</style>

组件页面

 <template>
<view class="selectedAddress" wx:if="{{isShow}}">
<view class="btnBox">
<text @tap.stop="btnCancelHandle">取消</text>
<text style="folat: right" @tap.stop="btnSureHandle">确定</text>
</view>
<!-- picker-view 的change事件 -->
<picker-view class="pickerBox" value="{{value}}" bindchange="selectedAddressHandle">
<!-- 省 -->
<picker-view-column>
<repeat for="{{provinces}}">
<view class="picker-item">{{item.name}}</view>
</repeat>
</picker-view-column>
<!-- 市 -->
<picker-view-column>
<repeat for="{{citys}}">
<view class="picker-item">{{item.name}}</view>
</repeat>
</picker-view-column>
<!-- 区 -->
<picker-view-column>
<repeat for="{{areas}}">
<view class="picker-item">{{item.name}}</view>
</repeat>
</picker-view-column>
</picker-view>
<view></view>
</view>
</template>
<script>
import wepy from 'wepy';
import address from '@/utils/data'; //引入全国地区信息
export default class selectedAddress extends wepy.component {
// props 接收父组件传递过来的值
props = {
provinces: { //省数据
type: Array,
default: [],
},
citys: { //市数据
type: Array,
default: [],
},
areas: { //区数据
type: Array,
default: [],
},
value: {
type: Array,
default: [0, 0, 0],
},
isShow: {
type: Boolean,
default: false
}
} components = {} data = { }
onLoad() {}
computed = {}
methods = {
btnCancelHandle() { //点击取消, $emit通知父组件page页面,
this.$emit('cancel');
},
btnSureHandle() { //点击确定, $emit通知父组件page页面, 并将选择的省市区发送给父组件
let value = this.value;
let areaInfo = this.provinces[value[0]].name + '·' + this.citys[value[1]].name + '·' + this.areas[value[2]].name;
this.$emit('sure', areaInfo); },
selectedAddressHandle(e) { //picker-view的 change事件 处理三级联动
let that = this;
let e_value = e.detail.value;
let provinceNum = e_value[0];
let cityNum = e_value[1];
let areaNum = e_value[2];
console.log("组件",e_value);
console.log('数组', provinceNum + '--' + cityNum + '--' + areaNum);
if (that.value[0] != provinceNum){ //第一列滚动处理
let id = that.provinces[provinceNum].id;
that.value = [provinceNum, 0, 0];
that.citys = address.citys[id];
that.areas = address.areas[address.citys[id][0].id];
that.$apply(); //that.$apply() 更新数据 和原生小程序的this.setData({})作用一样 } else if (that.value[1] != cityNum) { //第二列滚动处理
let id = that.citys[cityNum].id;
that.value = [provinceNum, cityNum, 0];
that.areas = address.areas[id];
that.$apply();
} else if (that.value[2] != areaNum) { //第三列处理
that.value = [provinceNum, cityNum, areaNum];
that.$apply();
}
}
}
event = {}
}
</script>
<style lang="less">
.selectedAddress{
width: 100%;
display: flex;
z-index: 99;
background-color: #ffffff;
background: rgba(0, 0, 0, .2);
flex-direction: column;
justify-content: center;
align-items: center;
position: fixed;
bottom: 0;
left: 0;
height: 40vh;
}
.btnBox{
width: 100%;
height: 90rpx;
padding: 0 24rpx;
box-sizing: border-box;
line-height: 90rpx;
text-align: center;
display: flex;
background: rgba(255, 255, 255, .8);
justify-content: space-between;
}
.pickerBox{
width: 100%;
height: 389rpx;
.picker-item{
line-height: 70rpx;
margin-left: 5rpx;
margin-right: 5rpx;
text-align: center;
}
}
</style>

结语: 这是在小程序wepy框架中使用的, 如果要在原生小程序中使用, 可以作为参考,自己进行修改; 

    由于本人踏入前端时间不长(半年的时间), 如果文章写得有错误的地方,实在抱歉,也请您留言指出错误,我会第一时间修改.

    努力努力再努力, 加油!!

小程序--wepy省市区三级联动选择的更多相关文章

  1. vue仿京东省市区三级联动选择组件

    工作中需要一个盒京东购物车地址选择相似的一个省市区三级联动选择组件,google查了下都是下拉框形式的,于是自己写了一个,希望对使用vue开发项目的朋友有帮助,显示效果如下:使用vue2.0开发 ht ...

  2. Android中使用开源框架citypickerview实现省市区三级联动选择

    1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...

  3. layui自定义插件citySelect 省市区三级联动选择

    省市区三级菜单联动插件 citySelect.js /** * @ name : citySelect 省市区三级选择模块 * @ Author: aggerChen * @ version: 1.0 ...

  4. laraveladmin省市区三级联动

    Distpicker是一个中国省市区三级联动选择组件,这个包是基于Distpicker的laravel-admin扩展,用来将Distpicker集成进laravel-admin的表单中 安装 com ...

  5. 原生JS实现省市区(县)三级联动选择

    原文地址→看过来 写在前面 前段时间写一个关于天气的东西,里面的省市区(县)城市选择让我很头疼,在网上搜索出来大都是借助插件或者第三方库,感觉这样做代码会很重,所以索性就把几种城市选择的方式实现一遍, ...

  6. JS实现年月日三级联动+省市区三级联动+国家省市三级联动

    开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...

  7. 【转】纯JS省市区三级联动(行政区划代码更新至2015-9-30)

    本文代码实现的功能是省市区三级联动下拉列表,纯Javascript,网上已有很多这方面的代码.但是作为一个新手,这是我的第一篇CSDN博客,发此文的目的主要是学习交流,希望看到的朋友发现有什么不对的地 ...

  8. 用jsp实现省市区三级联动下拉

    jsp+jquery实现省市区三级联动下拉 不少系统都需要实现省市区三级联动下拉,像人口信息管理.电子商务网站.会员管理等,都需要填写地址相关信息.而用ajax实现的无刷新省市区三级联动下拉则可以改善 ...

  9. 插件 原生js 省市区 三级联动 源码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. NOIP2016 DAY2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  2. swiper.js在隐藏/显示切换时,轮播出现bug的解决办法

    swiper在 swiper-container正常状态下显示,轮播是没有问题,但是当 swiper-container由隐藏切换至显示时(比如做图片查看时)会出现滑动bug,滑动卡顿而且最后一张可以 ...

  3. 环境搭建Selenium2+Eclipse+Java+TestNG_(一)

    第一步  安装JDK 第二步 下载Eclipse 第三步 在Eclipse中安装TestNG 第四步 下载Selenium IDE.SeleniumRC.IEDriverServer 第五步 下载Fi ...

  4. BA-siemens-PXM液晶面板

    PXM面板作用:可以查看模块内部的信息,可以触发控制点来近程控制模块上的点位(非常便于现场调试). 优点:1.便于现场紧急控制,有些地方是必须要加上的,如工厂控制等项目,假如机器死机,可以通过面板切换 ...

  5. 使用angularjs的$http.post异步提交数据时,服务器接收不了的问题

    一,在正常情况下,使用表单的post方法提交数据,默认请求头的Content-Type:application/x-www-form-urlencoded类型, 提交数据格式如下: 二,使用angul ...

  6. Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)

    近期在读Hadoop#Yarn部分的源代码.读到状态机那一部分的时候,感到enmu的使用方法实在是太灵活了,在给并发编程网翻译一篇文章的时候,正好碰到一篇这种文章.就赶紧翻译下来,涨涨姿势. 原文链接 ...

  7. jenkins下载

    前置条件:需要有java环境的jdk 一.安装使用 下载地址:https://jenkins-ci.org/content/thank-you-downloading-windows-installe ...

  8. RecyclerView的点击事件

    RecyclerView 一.简单介绍 这个是谷歌官方出的控件.使我们能够很easy的做出列表装的一个控件,当然recyclerview的功能不止这些,它还能够做出瀑布流的效果,这是一个很强大的控件, ...

  9. win10怎样开启自带虚拟机

    win10和win8一样.都有自带的虚拟机,可是功能没有一安装上就打开,非常多喜欢用自带的东西,那么win10自带的虚拟机怎样开启呢? 首先要找到控制面板,我们右键点击開始button,我们找到&qu ...

  10. 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t

    菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...