在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

微信小程序中使用picker封裝省市區3級聯動的完成

微信小程序中使用picker封裝省市區3級聯動的完成

更新時間:2025-09-24 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
這篇文章主要介紹了微信小程序 使用picker封裝省市區三級聯動實例代碼的相關資料,需要的朋友可以參考下

微信小程序 使用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的規范的】

<?php 
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::

<template name="city"> 
<view class="areas"> 
 <view class="province"> 
  <picker bindchange="provincePickerChange" value="{{provinceIndex}}" range="{{province.name}}" data-city-url="{{cityUrl}}"> 
  <text class="select-item">{{province.name[provinceIndex]}}</text> 
  </picker> 
 </view> 
 
 <view class="city"> 
 <block wx:if="{{!city.name.length}}"> --二級市區-- </block> 
 <block wx:if="{{city.name.length>0}}">  
  <picker bindchange="cityPickerChange" value="{{cityIndex}}" range="{{city.name}}" data-county-url="{{countyUrl}}"> 
   <text class="select-item">{{city.name[cityIndex]}}</text> 
  </picker> 
 </block> 
 </view> 
 
 <view class="county"> 
 <block wx:if="{{!county.name.length}}"> --三級地區-- </block> 
 <block wx:if="{{county.name.length>0}}"> 
  <picker bindchange="countyPickerChange" value="{{countyIndex}}" range="{{county.name}}"> 
   <text class="select-item">{{county.name[countyIndex]}}</text> 
  </picker> 
 </block> 
 </view> 
 
</view> 
</template>

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::

<import src="../../template/cityTemplate.wxml"/> 
<template is="city" data="{{...city}}" />

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 ); 
 } 
})

以上完整代碼文件,最終測試如下:

微信小程序中使用picker封裝省市區三級聯動的實現

這里存在一個bug,開啟下拉刷新和picker組件的下拉會重疊了,不知道是開發工具原因,還是還為修改的bug。。。只能等微信方面更新消息給反饋了

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

微信小程序仿美團城市選擇的實現

微信小程序城市定位的實現

以上就是微信小程序中使用picker封裝省市區三級聯動的實現的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • www.久久久久久久久久久| 国产欧美精品一二三| 日韩精品一区二区三区四| 尤蜜粉嫩av国产一区二区三区| 乱熟女高潮一区二区在线| 日本一本在线视频| 免费网站在线观看黄| 欧美精品 - 色网| 九九九九九九九九| 亚洲欧美一二三| 女女百合国产免费网站| 国产精品视频一二三四区| 毛片在线视频观看| 成人网站免费观看入口| 久久综合九色综合88i| 国产二级片在线观看| 国内外免费激情视频| 性生活免费在线观看| 不卡的在线视频| 日日噜噜夜夜狠狠久久丁香五月| 亚洲av毛片在线观看| 男人添女人荫蒂免费视频| 国产69精品久久久久久久| 亚洲中文字幕久久精品无码喷水 | 狠狠精品干练久久久无码中文字幕| 久久av秘一区二区三区| 国产欧美久久久久| 97xxxxx| 婷婷激情四射五月天| 黄色小视频大全| 天堂在线资源视频| 久久久成人精品一区二区三区| 日韩视频在线视频| 日韩中文字幕a| 久久男人资源站| 伊人国产在线视频| www.av91| 中文字幕在线视频一区二区三区| 国产女教师bbwbbwbbw| 九色porny91| 国产av人人夜夜澡人人爽麻豆| 五月婷婷深爱五月| 亚洲精品无码国产| 特级黄色录像片| 成人日韩在线视频| 欧美a在线视频| 国产精彩视频一区二区| 中文字幕第一页在线视频| 成人中文字幕在线播放| 裸体裸乳免费看| 亚洲性图一区二区| 亚洲人成色77777| 免费av手机在线观看| 999久久欧美人妻一区二区| 在线免费视频一区| 黑鬼大战白妞高潮喷白浆| 国产毛片久久久久久国产毛片| 欧美激情第一区| 一区二区三区 日韩| 成人羞羞国产免费网站| 久久亚洲中文字幕无码| 国产传媒久久久| 伊人久久在线观看| 国产精品波多野结衣| 91香蕉视频免费看| 北条麻妃亚洲一区| 激情视频免费网站| 精品日韩久久久| 一级黄色特级片| 青青草原国产在线视频| gogogo高清免费观看在线视频| 欧美成人黄色网址| 奇米影视四色在线| 国产精品99久久久久久大便| 亚洲成年人专区| 日韩欧美猛交xxxxx无码| 亚洲国产一二三精品无码| 手机福利在线视频| 91亚洲精品国产| 欧洲精品在线播放| 日韩精品一区二区三区色欲av| 国产中文字幕在线免费观看| 久久国产色av免费观看| 亚洲精品综合在线观看| 中国一级黄色录像| 国产精彩视频一区二区| 国产一级片黄色| 在线a免费观看| 国产不卡一区二区视频| 美女福利视频在线| 超碰在线免费av| 六月婷婷在线视频| 99热这里只有精品在线播放| 天天做天天干天天操| 人妻互换免费中文字幕| 国产乱子夫妻xx黑人xyx真爽| 欧美午夜性生活| 26uuu成人| 精品久久久噜噜噜噜久久图片 | 8x8ⅹ国产精品一区二区二区| 成人免费在线小视频| 成人性生交免费看| 亚洲理论电影在线观看| 国产视频1区2区3区| 大伊香蕉精品视频在线| 午夜激情在线观看视频| 久久福利一区二区| 美女黄色片视频| 亚洲小视频在线播放| 激情伊人五月天| 手机福利在线视频| 91插插插插插插插插| 国产超级av在线| 800av在线免费观看| 爱爱爱爱免费视频| 黄色片一级视频| 日本午夜激情视频| 大片在线观看网站免费收看| 日韩爱爱小视频| 国产免费成人在线| 日韩a∨精品日韩在线观看| 99热都是精品| 精品国产鲁一鲁一区二区三区| 成人一级片网站| 欧美精品99久久| 日韩精品一区在线视频| 国产资源第一页| 国产又大又长又粗又黄| 亚洲欧美天堂在线| 亚洲av无日韩毛片久久| 日本高清久久久| 亚洲娇小娇小娇小| 久国产精品视频| 亚洲天堂网站在线| 日韩最新中文字幕| 欧洲金发美女大战黑人| 青青草综合视频| 日韩成人三级视频| 国产人妻777人伦精品hd| 成人黄色av片| 日本熟妇人妻xxxxx| 国产精品无码av无码| 亚洲无吗一区二区三区| 日本美女视频一区| 欧美xxxx吸乳| 国产精品又粗又长| 麻豆传传媒久久久爱| 青青草av网站| 亚洲综合123| 国产精品久久久久7777| 男女av免费观看| 久久黄色片网站| 国产精品无码免费专区午夜| av免费观看大全| 亚洲综合欧美在线| 日韩精品免费一区| 久久久久狠狠高潮亚洲精品| 亚洲国产日韩欧美在线观看| av动漫在线免费观看| 欧在线一二三四区| 99精品一级欧美片免费播放| 男人添女荫道口图片| 天天干天天爽天天射| 国产女人18毛片| 99热成人精品热久久66| 毛毛毛毛毛毛毛片123| 免费国产黄色网址| 亚洲欧美天堂在线| 日本丰满少妇xxxx| xxxx在线免费观看| 国产二级片在线观看| 色91精品久久久久久久久| 日韩亚洲欧美视频| 亚洲热在线视频| 可以在线看的黄色网址| 老司机午夜免费福利视频| 天美星空大象mv在线观看视频| 欧美激情第四页| 国产又黄又猛又粗又爽的视频| 欧洲金发美女大战黑人| 亚洲36d大奶网| 免费午夜视频在线观看| 真人抽搐一进一出视频| 99精品一区二区三区的区别| 亚洲xxxx2d动漫1| 欧美一区二区三区爽大粗免费| 欧美少妇一级片| 欧美激情国内自拍| 精品日韩久久久| 日本黄网站免费| 每日在线更新av| 免费国产黄色网址| 国产精品国产三级国产专区51| 久久精品久久99| 99久久99精品| 少妇熟女一区二区| 欧美另类videos| 996这里只有精品| www.成年人视频| 国产av麻豆mag剧集|