果玩软件园:为用户提供海量热门软件、游戏等手机资源下载服务!

装机必备热门标签玩游戏装软件BT游戏H5游戏看教程专题游戏盒子手机版

果玩软件园

所在位置:首页 > 资讯教程 > 软件教程 >  > 详情

微信小程序的picker组件不能使用对象怎么办?

文章来源:网络作者:画青笺ぶ发布时间:2026-05-29 04:26:49

GM盒子
GM盒子(高返利版)
GM手游福利平台,免费送首充,上线送VIP,免费领元宝和代金券。
Ready

  今天小编给大家讲解微信小程序的picker组件不能使用对象怎么办? 有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的。

  在封装省市区三级联动的时候,发现微信小程序的picker组件不能直接使用索引数组({key : value}),

  于是在服务器端把索引数组中的key和value用个循环分离出来,再存入新数组中。如图

  {

  a : \'a_value\',

  b : \'b_value\'

  }

  改为

  {

  keys : [a, b],

  values : [\'a_value\', \'b_value\']

  }

  然后就可以用picker显示了,而且keys数组和values数组的index是对应的,如果想取出原来的索引只需要values[index]即可,

  相关代码: 使用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]}}

  

  

  

   --二级市区-- 

  0}}">

  

  {{city.name[cityIndex]}}

  

  

  

  

   --三级地区-- 

  0}}">

  

  {{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: "表示获取地区 fcode是一级code码,到时具体根据后端请求参数修改

  countyUrl: "="

  }

  })

  var _url = "";

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

  city.initCityFun( _that, _url, _data );

  }

  })

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

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

  以上就是微信小程序的picker组件不能使用对象怎么办的全部内容了,大家都学会了吗?

End
复制本文链接资讯文章为果玩软件园所有,未经允许不得转载。
热门游戏MORE+
相关资讯MORE+
最新录入
热门资讯
新游新品榜
手机游戏
休闲益智
赛车竞速
棋牌桌游
角色扮演
动作射击
体育竞技
经营养成
策略塔防
冒险解谜
音乐游戏
手游辅助
H5游戏
BT游戏
手机软件
社交聊天
系统工具
时尚购物
旅游出行
影音播放
生活实用
办公学习
资讯阅读
拍摄美化
游戏辅助
健康医疗
地图导航
小说漫画
安全防护
育儿亲子
手游下载
梦想三国之勇往直前0....
炼仙传说0.1折
不可思议的刀剑与魔法...
逍遥浪人
奇幻梦旅人
玄影0.1折
点击冒险之旅(0.1折特...
天神赵子龙0.1折
九州异兽记0.1折
龙魂魔法0.1折
装机软件
爱奇艺电脑版
Steam下载管家 2026最...
360游戏大厅
GoLink加速器
3DM驱动大师
夸克
豆包电脑版
360C盘扩容大师
360录屏
360极速浏览器
精选专题
手机游戏专题
手机软件专题
电脑软件专题
电脑游戏专题
游戏排行榜
手游排行榜
软件排行榜
BT排行榜
电脑软件排行榜
电脑游戏排行榜