【微信小程序】手写索引选择器(城市列表,汽车品牌选择列表)
摘要: 小程序索引选择器,点击跳转相应条目,索引可滑动,滑动也可跳转
场景:城市选择列表, 汽车品牌选择列表
所用组件: scroll-view(小程序原生) https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html

list: [
{
"letter": "A",
"list": [{
"name": "奥迪1",
"id": 1
},
{
"name": "奥迪2",
"id": 2
}]
},
{
"letter": "B",
"list": [{
"name": "宝马1",
"id": 3
},
{
"name": "宝马2",
"id": 4
}]
},
{
"letter": "C",
"list": [{
"name": "麻喇沙底",
"id": 5
},
{
"name": "adidas",
"id": 6
}]
},
{
"letter": "D",
"list": [{
"name": "煲事件",
"id": 7
},
{
"name": "保时捷",
"id": 8
}]
},
{
"letter": "E",
"list": [{
"name": "宝马1",
"id": 9
},
{
"name": "宝马2",
"id": 10
}]
},
{
"letter": "F",
"list": [{
"name": "宝马1",
"id": 11
},
{
"name": "宝马2",
"id": 12
}]
},
{
"letter": "G",
"list": [{
"name": "宝马1",
"id": 15
},
{
"name": "宝马2",
"id": 16
}]
},
{
"letter": "H",
"list": [{
"name": "宝马1",
"id": 17
},
{
"name": "宝马2",
"id": 18
}]
},
{
"letter": "I",
"list": [{
"name": "宝马1",
"id": 19
},
{
"name": "宝马2",
"id": 20
}]
},
{
"letter": "J",
"list": [{
"name": "宝马1",
"id": 21
},
{
"name": "宝马2",
"id": 22
}]
},
{
"letter": "K",
"list": [{
"name": "宝马1",
"id": 23
},
{
"name": "宝马2",
"id": 24
}]
},
]
html 结构:
主体部分
<scroll-view class="content" scroll-y="true" :style="scrollHeight" :scroll-top="scrollData.scrollTop" :scroll-into-view="toView">
<ul class="brandList">
<li v-for="(item, index) in list" :key="index" :id="item.letter">
<h2>{{item.letter}}</h2>
<div v-for="(el, i) in item.list" :key="i" class="pro" @click="getToast(el.name)">
<img src="/static/images/user.png" alt="" mode="aspectFit">
<span>{{el.name}}</span>
</div>
</li>
</ul>
</scroll-view>
// 侧边导航栏
<div class="letterList" @touchstart="handlerTouchMove"
@touchmove="handlerTouchMove"
@touchend="handlerTouchEnd" :style="fixedTop">
<p v-for="(item, index) in list" :key="index" @click="getLetter(item.letter)">{{item.letter}}</p>
</div>
scrollData: {
scrollTop: 0,
},
toView:'A',
step1:
首先,侧边导航栏肯定是用fixed定位固定(一般在右侧),其次在竖直方向居中,调用wx.getSystemInfo
let fixedTop = 0;
let length = this.list.length // 取到list数组的length,因为list的length决定了侧边导航的高度
wx.getSystemInfo({
success(res) {
fixedTop = (res.windowHeight - (20 * length))/2 //20为侧边导航每个p的高度
}
})
step2
手指在侧边导航滑动时的js
handlerTouchMove (e) {
let touches = e.touches[0] || {}
let pageY = touches.pageY
let rest = pageY - this.fixedTop
let index = Math.ceil(rest / 20)
console.log(this.list.length, index, 206);
console.log(index,195);
if(index > this.list.length) {
index = this.list.length - 1//
}
if( 0 <index <= this.list.length) { // 1213 10 9
12 index = index - 1
13 }
14 if(index <= 0) {
15 index = 0
16 }
17 let letter = this.list[index].letter
18 wx.showToast({
19 title: letter,
20 icon: 'none',
21 duration: 2000
22 })
23 this.toView = letter
24 },
25 handlerTouchEnd () {
26 wx.hideLoading()
27 },
step3
点击侧边索引时的js
getLetter (letter) {
this.toView = letter
},
结束惹,88, 下次见
是
【微信小程序】手写索引选择器(城市列表,汽车品牌选择列表)的更多相关文章
- 微信小程序开发之picker选择器组件用法
picker组件时一个从底部弹起的可滚动的选择器(嵌入页面滚动器组件picker-view查看https://mp.weixin.qq.com/debug/wxadoc/dev/component/p ...
- 「小程序JAVA实战」 小程序手写属于自己的第一个demo(六)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-06/ 自己尝试的写一个小demo,用到自定义样式,自定义底部导航,页面之间的跳转等小功能.官方文档 ...
- 微信小程序-获取当前位置和城市名
微信小程序-获取当前城市位置 1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数) ...
- mpvue开发微信小程序之时间+日期选择器
最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...
- 微信小程序初探--写个扫雷分享给你玩
闲暇里,想学一下微信小程序, 于是,用微信小程序原生做了个扫雷玩. 以下略作总结,分享给大家. 微信里下拉,输入[mini计算器], 看到这个图标的就是了: 说好的扫雷,怎么变成计算器了?原因后面解释 ...
- [微信小程序] 微信小程序下拉滚动选择器picker绑定数据的两种方式
小程序 picker 多列选择器 数据动态获取 需求是将各校区对应各班级的数据 以两列选择器的方式展示出来,并且可以在选择完成之后记录选结果参数. 校区数据 和 班级数据 分别是两个接口,以 校区 t ...
- mpvue微信小程序怎么写轮播图,和官方微信代码的差别
目前用mpvue很多第三方的ui库是引入不了的,因为它不支持含有dom操作. 那我们要做轮播图的话一个是手写另外一个就是用小程序的swiper组件了: 官方代码: <swiper indicat ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
- 微信小程序手绘地图实现之《Canvas》
环境:微信SDK2.9+ + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...
随机推荐
- MySQL 合并字段及列转行
数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断 ...
- ImportError: cannot import name 'render_to_response' 解决方法
前几天 Django 官方推出了 3.0 框架,项目在 K8S 内部署启动的时候,报了这个错:ImportError: cannot import name 'render_to_response' ...
- 【模板】gcd和exgcd
1. gcd: int gcd(int a,int b) { return !b?a:gcd(b,a%b); } exgcd: int exgcd(int a,int b,int& x,int ...
- 面试官:说说Mysql数据库分库分表,并且会有哪些问题?
之前一篇文章已经谈到了数据库集群之主从集群也就是读写分离,也提到了读写分离其实只是分担了访问的压力,但是存储的压力没有解决. 存储的压力说白了就是随着系统的演化,需求的增加,可能表的数量会逐渐增多,比 ...
- jenkins环境自动部署
https://my.oschina.net/tonystark/blog/1920889 示例脚本: #!/bin/bash #export BUILD_ID=dontKillMe这一句很重要,这样 ...
- 线程池之ScheduledThreadPoolExecutor线程池源码分析笔记
1.ScheduledThreadPoolExecutor 整体结构剖析. 1.1类图介绍 根据上面类图图可以看到Executor其实是一个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池 ...
- Mysql综述--数据是如何读存的?(2)
页的结构 页是一种InnoDB管理存储空间的基本单位,它一般大小在16kb左右.实际上存在着许多不同类型的页,我们这次主要介绍的页是用来存储数据的,也叫做索引页. 接下来看看索引页的结构图: 比较重要 ...
- Vue-cli3脚手架工具快速创建一个项目
1.首先全局安装一下vue-cli3 npm install -g @vue/cli 或 yarn global add @vue/cli vue -V查看版本(这里注意V是大写哦) 2.vue cr ...
- 汇编指令之CMP, TEST指令
一.CMP指令 这一块呢,我不想上图了,汇编的博文我已经快要让我写吐了,其实也有好多我没有补充进来,比如进制,LEA指令,数据宽度,有符号,无符号的区分等等,但我真的要吐了,这些玩意我已经不是第一次写 ...
- 原生 JavaScript 代替 jQuery【转】
目录 用原生JavaScript代替jQuery Query Selector CSS & Style DOM Manipulation Ajax Events Utilities Promi ...