详解微信小程序开发之城市选择器 城市切换

发布时间 - 2026-01-10 22:35:21    点击率:

移动开发中城市选择器必不可少.

空白造了个.

gif:

这里只上部分js代码:

var city = require('../../utils/city.js');

Page({
 data: {
  searchLetter: [],
  showLetter: "",
  winHeight: 0,
  tHeight: 0,
  bHeight: 0,
  startPageY: 0,
  cityList: [],
  isShowLetter: false,
  scrollTop: 0,
  city: ""
 },
 onLoad: function (options) {
  // 生命周期函数--监听页面加载
  var searchLetter = city.searchLetter;
  var cityList = city.cityList();
  // console.log(cityInfo);

  var sysInfo = wx.getSystemInfoSync();
  console.log(sysInfo);
  var winHeight = sysInfo.windowHeight;

  //添加要匹配的字母范围值
  //1、更加屏幕高度设置子元素的高度
  var itemH = winHeight / searchLetter.length;
  var tempObj = [];
  for (var i = 0; i < searchLetter.length; i++) {
   var temp = {};
   temp.name = searchLetter[i];
   temp.tHeight = i * itemH;
   temp.bHeight = (i + 1) * itemH;

   tempObj.push(temp)
  }

  this.setData({
   winHeight: winHeight,
   itemH: itemH,
   searchLetter: tempObj,
   cityList: cityList
  })

  console.log(this.data.cityInfo);
 },
 onReady: function () {
  // 生命周期函数--监听页面初次渲染完成

 },
 onShow: function () {
  // 生命周期函数--监听页面显示

 },
 onHide: function () {
  // 生命周期函数--监听页面隐藏

 },
 onUnload: function () {
  // 生命周期函数--监听页面卸载

 },
 onPullDownRefresh: function () {
  // 页面相关事件处理函数--监听用户下拉动作

 },
 onReachBottom: function () {
  // 页面上拉触底事件的处理函数

 },
 onShareAppMessage: function () {
  // 用户点击右上角分享
  return {
   title: 'title', // 分享标题
   desc: 'desc', // 分享描述
   path: 'path' // 分享路径
  }
 },
 searchStart: function (e) {
  var showLetter = e.currentTarget.dataset.letter;
  var pageY = e.touches[0].pageY;
  this.setScrollTop(this, showLetter);
  this.nowLetter(pageY, this);
  this.setData({
   showLetter: showLetter,
   startPageY: pageY,
   isShowLetter: true,
  })
 },
 searchMove: function (e) {
  var pageY = e.touches[0].pageY;
  var startPageY = this.data.startPageY;
  var tHeight = this.data.tHeight;
  var bHeight = this.data.bHeight;
  var showLetter = 0;
  console.log(pageY);
  if (startPageY - pageY > 0) { //向上移动
   if (pageY < tHeight) {
    // showLetter=this.mateLetter(pageY,this);
    this.nowLetter(pageY, this);
   }
  } else {//向下移动
   if (pageY > bHeight) {
    // showLetter=this.mateLetter(pageY,this);
    this.nowLetter(pageY, this);
   }
  }
 },
 searchEnd: function (e) {
  // console.log(e);
  // var showLetter=e.currentTarget.dataset.letter;
  var that = this;
  setTimeout(function () {
   that.setData({
    isShowLetter: false
   })
  }, 1000)

 },
 nowLetter: function (pageY, that) {//当前选中的信息
  var letterData = this.data.searchLetter;
  var bHeight = 0;
  var tHeight = 0;
  var showLetter = "";
  for (var i = 0; i < letterData.length; i++) {
   if (letterData[i].tHeight <= pageY && pageY <= letterData[i].bHeight) {
    bHeight = letterData[i].bHeight;
    tHeight = letterData[i].tHeight;
    showLetter = letterData[i].name;
    break;
   }
  }

  this.setScrollTop(that, showLetter);

  that.setData({
   bHeight: bHeight,
   tHeight: tHeight,
   showLetter: showLetter,
   startPageY: pageY
  })
 },
 bindScroll: function (e) {
  console.log(e.detail)
 },
 setScrollTop: function (that, showLetter) {
  var scrollTop = 0;
  var cityList = that.data.cityList;
  var cityCount = 0;
  var initialCount = 0;
  for (var i = 0; i < cityList.length; i++) {
   if (showLetter == cityList[i].initial) {
    scrollTop = initialCount * 30 + cityCount * 41;
    break;
   } else {
    initialCount++;
    cityCount += cityList[i].cityInfo.length;
   }
  }

  that.setData({
   scrollTop: scrollTop
  })
 },
 bindCity: function (e) {
  var city = e.currentTarget.dataset.city;
  this.setData({ city: city })
 }
})

demo代码下载 

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


# 微信小程序城市选择器  # 微信小程序地区选择器  # 微信小程序实现自定义picker选择器弹窗内容  # 微信小程序 省市区选择器实例详解(附源码下载)  # 微信小程序三级联动选择器使用方法  # 微信小程序多列选择器range-key使用详解  # 微信小程序三级联动地址选择器的实例代码  # 微信小程序自定义多列选择器使用详解  # 微信小程序 滚动选择器(时间日期)详解及实例代码  # 微信小程序实现联动选择器  # 微信小程序日历弹窗选择器代码实例  # 微信小程序多项选择器checkbox  # 周期函数  # 必不可少  # 大家多多  # 加载  # 触底  # 选择器  # options  # function  # bindCity  # demo  # onLoad  # isShowLetter  # cityList  # scrollTop  # false  # console  # itemH  # windowHeight  # tempObj  # length 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  独立制作一个网站多少钱,建立网站需要花多少钱?  如何解决hover在ie6中的兼容性问题  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何在阿里云通过域名搭建网站?  如何在IIS服务器上快速部署高效网站?  Laravel怎么在Blade中安全地输出原始HTML内容  如何在香港免费服务器上快速搭建网站?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  C++时间戳转换成日期时间的步骤和示例代码  Python进程池调度策略_任务分发说明【指导】  Laravel中的Facade(门面)到底是什么原理  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  制作企业网站建设方案,怎样建设一个公司网站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  免费网站制作appp,免费制作app哪个平台好?  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  用v-html解决Vue.js渲染中html标签不被解析的问题  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何在阿里云高效完成企业建站全流程?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何撰写建站申请书?关键要点有哪些?  Laravel中的withCount方法怎么高效统计关联模型数量  新三国志曹操传主线渭水交兵攻略  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  南京网站制作费用,南京远驱官方网站?  如何快速生成高效建站系统源代码?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Android GridView 滑动条设置一直显示状态(推荐)  如何彻底删除建站之星生成的Banner?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何快速查询网站的真实建站时间?  javascript基于原型链的继承及call和apply函数用法分析  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Python面向对象测试方法_mock解析【教程】  如何快速打造个性化非模板自助建站?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  深圳网站制作平台,深圳市做网站好的公司有哪些?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】