java封装省市区三级json格式,微信开发 使用picker封装省市区三级联动模板

目前学习小程序更多的是看看能否二次封装其它组件,利于以后能快速开发各种小程序应用。目前发现picker的selector模式只有一级下拉,那么我们是否可以通过3个picker来实现三级联动模板的形式来引入其它页面中呢?答案是肯定可以的。那么我的思路是这样的:

1、使用template模板语法进行封装,数据从页面传入

2、根据picker组件的语法,range只能是一组中文地区数组,但是我们需要每个地区的唯一码来触发下一级联动数据。这样,我的做法是通过一个对象里面的两组数据分表存储中文名和唯一码的两个对象数组。格式【province:{code:['110000', '220000'...], name: ['北京市', '天津市'...]}】,这个格式是固定的,需要服务端配合返回

3、通过picker的bindchange事件来获取下一级的数据,每个方法都写入函数中在暴露出来供页面调用

然后讲下我demo的目录结构:

common

-net.js//wx.request请求接口二次整合

-cityTemplate.js//三级联动方法

page

-demo

-demo.js

-demo.wxml

template

-cityTemplate.wxml

app.js

app.json

app.wxss

然后,使用phpstudy搭建了简单的服务端供测试。不要问我服务端的为啥是这样的,我也不懂,刚入门我只要数据...

当然你可以省掉这一步,将数据直接固定在demo.js里面进行测试...

代码如下:【服务端的返回数据格式是遵循了下面的retArr的规范的】

header("Content-type: text/html; charset=utf-8");

$type=$_REQUEST["type"];//获取省市区的标志

$fcode=$_GET["fcode"];

$retArr=[

"status"=>true,

"data"=>[],

"msg"=>""

];

if($type!="province" && $type!="city" && $type!="county"){

$retArr["status"]=false;

$retArr["msg"]="获取地区类型错误,请检查";

echo json_encode($retArr);

exit;

}

function getProvince(){

$province=[];

$code=["110000", "350000", "710000"];

$province["code"]=$code;

$name=["北京市", "福建省", "台湾省"];

$province["name"]=$name;

$fcode=["0", "0", "0"];

$province["fcode"]=$fcode;

return $province;

}

function getCity($P_fcode){

$city=[];

$code=[];

$name=[];

$fcode=[];

if($P_fcode=="110000"){

$code=["110100"];

$name=["北京市"];

$fcode=$P_fcode;

}

if($P_fcode=="350000"){

$code=["350100", "350200", "350300", "350400", "350500", "350600", "350700", "350800", "350900"];

$name=["福州市", "厦门市", "莆田市", "三明市", "泉州市", "漳州市", "南平市", "龙岩市", "宁德市"];

$fcode=$P_fcode;

}

if($P_fcode=="710000"){

}

$city=["code"=>$code, "name"=>$name, "fcode"=>$fcode];

return $city;

}

function getCounty($P_fcode){

$county=[];

$code=[];

$name=[];

$fcode=[];

if($P_fcode=="110100"){

$code=["110101", "110102", "110103", "110104", "110105", "110106", "110107"];

$name=["东城区", "西城区", "崇文区", "宣武区", "朝阳区", "丰台区", "石景山区"];

$fcode=$P_fcode;

}

if($P_fcode=="350100"){

$code=["350102", "350103", "350104"];

$name=["鼓楼区", "台江区", "苍山区"];

$fcode=$P_fcode;

}

if($P_fcode=="350200"){

$code=["350203", "350205", "350206"];

$name=["思明区", "海沧区", "湖里区"];

$fcode=$P_fcode;

}

$county=["code"=>$code, "name"=>$name, "fcode"=>$fcode];

return $county;

}

//var_dump($province);

if($type=="province"){

$province=getProvince();

$retArr["data"]=$province;

}else if($type=="city"){

$city=getCity($fcode);

$retArr["data"]=$city;

}else if($type="county"){

$county=getCounty($fcode);

$retArr["data"]=$county;

}

echo json_encode($retArr);

?>

接下来是cityTemplate.wxml::

{{province.name[provinceIndex]}}

--二级市区--

{{city.name[cityIndex]}}

--三级地区--

{{county.name[countyIndex]}}

cityTemplate.js::

/**

* 获取三级联动的三个函数

* that: 注册页面的this实例 必填

* p_url: 一级省份url 必填

* p_data:一级省份参数 选填

*/

var net = require( "net" );//引入request方法

var g_url, g_datd, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method;

function initCityFun( that, p_url, p_data ) {

//获取一级省份数据

g_cbSuccess = function( res ) {

that.setData( {

'city.province': res

});

};

net.r( p_url, p_data, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );

//点击一级picker触发事件并获取市区方法

var changeProvince = function( e ) {

that.setData( {

'city.provinceIndex': e.detail.value

});

var _fcode = that.data.city.province.code[ e.detail.value ];

if( !_fcode ) {

_fcode = 0;

}

var _cityUrl = e.target.dataset.cityUrl;

g_url = _cityUrl + _fcode;

g_cbSuccess = function( res ) {

that.setData( {

'city.city': res

});

}

net.r( g_url, g_datd, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );

};

that[ "provincePickerChange" ] = changeProvince;

//点击二级picker触发事件并获取地区方法

var changeCity = function( e ) {

that.setData( {

'city.cityIndex': e.detail.value

});

var _fcode = that.data.city.city.code[ e.detail.value ];

if( !_fcode ) {

_fcode = 0;

}

var _countyUrl = e.target.dataset.countyUrl;

g_url = _countyUrl + _fcode;

g_cbSuccess = function( res ) {

that.setData( {

'city.county': res

});

};

net.r( g_url, g_datd, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );

};

that[ "cityPickerChange" ] = changeCity;

//点击三级picker触发事件

var changeCounty = function( e ) {

that.setData( {

'city.countyIndex': e.detail.value

});

};

that["countyPickerChange"]=changeCounty;

}

function getProvinceFun(that, p_url, p_data){

g_cbSuccess = function( res ) {

that.setData( {

'city.province': res

});

};

net.r( p_url, p_data, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );

}

module.exports={

initCityFun: initCityFun,

getProvinceFun: getProvinceFun

}

顺道net.js方法::

/**

* 网络发送http请求,默认为返回类型为json

*

* url: 必须,其他参数非必须 接口地址

* data:请求的参数 Object或String

* successFun(dts):成功返回的回调函数,已自动过滤微信端添加数据,按接口约定,返回成功后的data数据,过滤掉msg和status

* successErrorFun(msg):成功执行请求,但是服务端认为业务错误,执行其他行为,默认弹出系统提示信息.

* failFun:接口调用失败的回调函数

* completeFun:接口调用结束的回调函数(调用成功、失败都会执行)

* header:object,设置请求的 header , header 中不能设置 Referer

* method:默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

*

*/

function r( url, data, successFun, successErrorFun, failFun, completeFun, header, method ) {

var reqObj = {};

reqObj.url = url;

reqObj.data = data;

//默认头为json

reqObj.header = { 'Content-Type': 'application/json' };

if( header ) {

//覆盖header

reqObj.header = header;

}

if( method ) {

reqObj.method = method;

}

reqObj.success = function( res ) {

var returnData = res.data; //将微信端结果过滤,获取服务端返回的原样数据

var status = returnData.status; //按接口约定,返回status时,才调用成功函数

//console.log(res);

//正常执行的业务函数

if( status == true ) {

if( successFun ) {

var dts = returnData.data;

successFun( dts );//回调,相当于获取到data后直接在回调里面处理赋值数据

}

} else if( status == false ) {

var msg = returnData.msg;

if( !successErrorFun ) {

console.log( msg );

} else {

successErrorFun( msg );

}

} else {

console.log( "服务端没有按照接口约定格式返回数据" );

}

}

reqObj.fail = function( res ) {

if( failFun ) {

failFun( res );

}

}

reqObj.complete = function( res ) {

if( completeFun ) {

completeFun( res );

}

}

wx.request( reqObj );

}

module.exports = {

r: r

}

核心代码就是上面这三个文件,接下来是demo文件做测试::

demo.wxml::

demo.js::

var city = require( '../../common/cityTemplate' );

Page( {

data: {

},

onLoad: function( options ) {

var _that = this;

//创建三级联动数据对象 ---- 这个city对象是固定的,只有请求的url是根据各自的服务端地址来更改的

_that.setData( {

city: {

province: {},//格式province:{code: ["11000", "12000"], name: ["北京市", "上海市"]},只能固定是name和code,因为模板需要根据这俩参数显示

city: {},

county: {},

provinceIndex: 0,

cityIndex: 0,

countyIndex: 0,

cityUrl: "http://localhost:8282/phpserver/areas.php?type=city&fcode=",//type表示获取地区 fcode是一级code码,到时具体根据后端请求参数修改

countyUrl: "http://localhost:8282/phpserver/areas.php?type=county&fcode="

}

})

var _url = "http://localhost:8282/phpserver/areas.php";

var _data = { 'type': 'province', 'fcode': '0' };

city.initCityFun( _that, _url, _data );

}

})

以上完整代码文件,最终测试如下:

25232a73ee1e7d091133fb24511200f4.gif

这里存在一个bug,开启下拉刷新和picker组件的下拉会重叠了,不知道是开发工具原因,还是还为修改的bug。。。只能等微信方面更新消息给反馈了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 1126. 查询活跃业务

文章目录1. 题目2. 解题1. 题目 事件表:Events ------------------------ | Column Name | Type | ------------------------ | business_id | int | | event_type | varchar | | occurences | int | ------------------------ 此表的主键是…

php linux 删除文件夹,linux下如何删除文件夹

linux下删除文件夹的方法:可以使用【rm -rf 目录名】命令进行删除,如【rm -rf /var/log/httpd/access】,表示删除/var/log/httpd/access目录及其下的所有文件、文件夹。直接rm就可以了,不过要加两个参数-rf 即:rm -rf …

LeetCode 1533. Find the Index of the Large Integer(二分查找)

文章目录1. 题目2. 解题1. 题目 We have an integer array arr, where all the integers in arr are equal except for one integer which is larger than the rest of the integers. You will not be given direct access to the array, instead, you will have an API Array…

MySQL Server Architecture

MySQL 服务器架构: 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968212.html

LeetCode MySQL 1479. 周内每天的销售情况(dayname星期几)

文章目录1. 题目2. 解题1. 题目 表:Orders ------------------------ | Column Name | Type | ------------------------ | order_id | int | | customer_id | int | | order_date | date | | item_id | varchar | | quantity …

php的swoole教程,PHP + Swoole2.0 初体验(swoole入门教程)

PHP Swoole2.0 初体验(swoole入门教程)环境:centos7 PHP7.1 swoole2.0准备工作:一、 swoole 扩展安装1 、下载swoolecd/usr/localwget -c https://github.com/swoole/swoole-src/archive/v2.0.8.tar.gztar -zxvf v2.0.8.tar.gzcdswoole-src-2.0.8/2 编…

Git常用命令解说

http://zensheno.blog.51cto.com/2712776/490748 1. Git概念 1.1. Git库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控…

LeetCode MySQL 1412. 查找成绩处于中游的学生

文章目录1. 题目2. 解题1. 题目 表: Student ------------------------------ | Column Name | Type | ------------------------------ | student_id | int | | student_name | varchar | ------------------------------ student_id 是该表…

LeetCode MySQL 618. 学生地理信息报告(row_number)

文章目录1. 题目2. 解题1. 题目 一所美国大学有来自亚洲、欧洲和美洲的学生,他们的地理信息存放在如下 student 表中。 | name | continent | |--------|-----------| | Jack | America | | Pascal | Europe | | Xi | Asia | | Jane | Americ…

java非必填字段跳过校验,avalon2表单验证,非必填字段在不填写的时候不能通过验证...

avalon2表单验证,非必填字段在不填写的时候不能通过验证代码var vm avalon.define({$id: "validate1",aaa : "",validate: {onError: function(reasons) {reasons.forEach(function(reason) {console.log(reason.getMessage())})},onValidateAll: functio…

jQuery心得5--jQuery深入了解串讲1

1.CSS-DOM 操作 获取和设置元素的样式属性: css()。 获取和设置元素透明度: opacity 属性(css 的一个属性)。 获取和设置元素高度, 宽度: height(), width(). 在设置值时, 若只传递数字, 则默认单位是 px. 如需要使用其他单位则需传递一个字符串, 例如 $(“p:first”).height(“…

LeetCode MySQL 1225. 报告系统状态的连续日期(date_sub + over)

文章目录1. 题目2. 解题1. 题目 Table: Failed ----------------------- | Column Name | Type | ----------------------- | fail_date | date | ----------------------- 该表主键为 fail_date。 该表包含失败任务的天数.Table: Succeeded --------------------…

LeetCode MySQL 1369. 获取最近第二次的活动(over窗口函数)

文章目录1. 题目2. 解题1. 题目 表: UserActivity ------------------------ | Column Name | Type | ------------------------ | username | varchar | | activity | varchar | | startDate | Date | | endDate | Date | -----------------…

侧边导航栏的实现

F:\java\c侧边栏\侧边菜单栏\MySlidingMenu转载于:https://www.cnblogs.com/ct732003684/archive/2013/03/24/2979416.html

LeetCode MySQL 569. 员工薪水中位数(over窗口函数)

文章目录1. 题目2. 解题1. 题目 Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。 ------------------------- |Id | Company | Salary | ------------------------- |1 | A | 2341 | |2 | A | 341 …

【IEnumerable】扩展方法的使用 C#

直接进入主题吧... IEnumerable : 公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。 好吧,迭代,我就理解成循环,这些名词真晦涩,没意思 今天看的是 Using Extension Methods ,使用"扩展方法…

LeetCode MySQL 571. 给定数字的频率查询中位数

文章目录1. 题目2. 解题1. 题目 Numbers 表保存数字的值及其频率。 ----------------------- | Number | Frequency | -----------------------| | 0 | 7 | | 1 | 1 | | 2 | 3 | | 3 | 1 | -------…

LeetCode 632. 最小区间(排序+滑动窗口)

文章目录1. 题目2. 解题1. 题目 你有 k 个升序排列的整数数组。 找到一个最小区间&#xff0c;使得 k 个列表中的每个列表至少有一个数包含在其中。 我们定义如果 b-a < d-c 或者在 b-a d-c 时 a < c&#xff0c;则区间 [a,b] 比 [c,d] 小。 示例 1: 输入:[[4,10,15,…

dz论坛php.ini设置,Discuz!X1.5至3.2论坛Win主机与Linux主机伪静态设置方法

用discuz x1.5至3.2的程序搭建的一个论坛&#xff0c;DZ论坛win主机与linux主机伪静态规则的设置方法&#xff01;Windows主机设置方法&#xff1a;1.建立一个名为 httpd.ini 的文件&#xff0c;可以先在电脑上面新建一个文本&#xff0c;然后将下面的这些代码复制到本文里面&a…

LeetCode MySQL 1194. 锦标赛优胜者

文章目录1. 题目2. 解题1. 题目 Players 玩家表 -------------------- | Column Name | Type | -------------------- | player_id | int | | group_id | int | -------------------- 玩家 ID 是此表的主键。 此表的每一行表示每个玩家的组。Matches 赛事表 -----…