English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В настоящее время изучение小程序 больше направлено на то, чтобы увидеть, можно ли повторно 包装 другие компоненты, что будет полезно для быстрого разработки различных приложений小程序 в будущем. В настоящее время обнаружено, что модель selector компонента picker может быть только одним уровнем下拉, так ли мы можем использовать три picker для создания многоуровневого шаблона связи и ввода других страниц? Ответ определенно да. Тогда мой план такой:
1、Использование синтаксиса шаблона template для упаковки, данные передаются с страницы
2、В соответствии с синтаксисом компонента picker, range может быть только массивом китайских регионов, но нам нужно уникальный код каждого региона для запуска следующего уровня связи данных. Таким образом, я храню两组 данных в объекте: один массив с китайскими названиями и один с уникальными кодами. Формат:【province:{code:['110000', '220000'...], name: ['Пекин', 'Тяньцзинь'...]}】,Этот формат фиксирован и требует配合 сервера для возврата
3、Получение данных следующего уровня через событие bindchange picker, каждый метод写入 функцию и экспортируйте её для вызова страницы
Затем я опишу структуру каталогов моего 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 уровня 1 провинции (обязательно) * p_data: параметры провинции уровня 1 (дополнительно) */ 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 }
By the way, net.js method: :
/** * Send http requests over the network, the default return type is json * * url: Must, other parameters are not required, interface address * data: The parameters of the request Object or String * successFun(dts): The callback function after a successful return, the data added by the WeChat end has been automatically filtered, according to the interface agreement, return the data after success, filter out msg and status * successErrorFun(msg): The request is executed successfully, but the server considers it a business error, and other actions are executed, the default is to pop up the system prompt information. * failFun: The callback function after the interface call fails * completeFun: The callback function after the interface call ends (both success and failure will be executed) * header:object, set the request header, Referer cannot be set in header * method: The default is GET, valid values: 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; // Default header is json reqObj.header = { 'Content-Type': 'application/json' }; if( header ) { // Override header reqObj.header = header; } if( method ) { reqObj.method = method; } reqObj.success = function( res ) { var returnData = res.data; // Filter the results from the WeChat end and get the original data returned by the server var status = returnData.status; // According to the interface agreement, the success function is called only when the status is returned //console.log(res);}} //Нормальная функция бизнеса if(status == true) { if(successFun) { var dts = returnData.data; successFun(dts); //回调, эквивалентно обработке данных после получения data } } var msg = returnData.msg; if(!successErrorFun) { console.log(msg); } successErrorFun(msg); } } 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 - это код первого уровня, в будущем конкретные параметры запроса сервера будут изменены 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 компоненты начинают перекрываться, не знаю, из-за ошибки в инструменте разработки или еще не исправленный баг... можно только ждать обновлений от WeChat и предоставлять обратную связь.
Вот и все, что было в этой статье, я надеюсь, что это поможет вам в изучении, и希望大家多多支持呐喊教程。
Заявление: содержание этой статьи взято из Интернета, авторское право принадлежит соответствующему автору, материал предоставлен пользователями Интернета в добровольном порядке, сайт не имеет права собственности, материал не был отредактирован вручную, и сайт не несет ответственности за соответствующие юридические последствия. Если вы обнаружите материал,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении, и предоставьте соответствующие доказательства. При подтверждении факта нарушения сайт немедленно удалил涉嫌侵权的内容。