小程序开发顶部TAB栏和侧边分类点击
先上一个效果图:
根据这个效果图我来说内容。
首先是顶部tab栏
效果实现依靠的是一个组件scroll-view。这个组件很有意思,可以多层嵌套,当然它的属性也很多。
这里主要用的是scroll-x,scroll-x的默认值是false,我们要设置为true。这一步我们仅仅是实现了可以左右滑动。
更重要的是如何判断滑动到了哪个位置,怎么获取对应内容。滑动距离由于我们是左右滑动所以这里是scroll-left,给scroll-left动态赋值。
这里我先上代码
<scroll-view scroll-x="true" class="tab-h" scroll-left="{{scrollLeft}}">
<view class="tab-item {{currentTab==0?'active':''}}" data-current="0" bindtap="swichNav">请假</view>
<view class="tab-item {{currentTab==1?'active':''}}" data-current="1" bindtap="swichNav">离职</view>
<view class="tab-item {{currentTab==2?'active':''}}" data-current="2" bindtap="swichNav">部门</view>
<view class="tab-item {{currentTab==3?'active':''}}" data-current="3" bindtap="swichNav">员工</view>
<view class="tab-item {{currentTab==4?'active':''}}" data-current="4" bindtap="swichNav">事项</view>
<view class="tab-item {{currentTab==5?'active':''}}" data-current="5" bindtap="swichNav">消息</view>
<view class="tab-item {{currentTab==6?'active':''}}" data-current="6" bindtap="swichNav">设置</view>
</scroll-view>
样式上我们用 {{currentTab==6?‘active’:’’}},这是一个三目运算,做逻辑判断的。相应的就要给current设置对应的序号,就是data-current的内容。除了滑动事件外,我们还需要加一个点击事件bindtap=“swichNav”。因为你不可能只用滑动显示的吧。
好了接下来看看JS中如何配置
这是在公共data{}存贮的内容,供给页面和函数来调用
interval: 5000,
duration: 500,
currentTab: 0, //预设当前项的值
scrollLeft: 0, //tab标题的滚动条位置
函数中这样来写,如果我们只有一屏的宽度内容滚动, this.checkCor();就用不到了。但是如果像示例图那样很多,我们还要判断超出一屏的宽度后要左移多少距离来显示后面的tab项,也就是scrollLeft给一个宽度值。
// 滚动切换标签样式
switchTab: function(e) {
this.setData({
currentTab: e.detail.current
});
this.checkCor();
},
// 点击标题切换当前页时改变样式
swichNav: function(e) {
var cur = e.target.dataset.current; //查询标题序号
if (this.data.currentTaB == cur) {
return false;
} else {
this.setData({
currentTab: cur
})
}
},
//判断当前滚动超过一屏时,设置tab标题滚动条。
checkCor: function() {
if (this.data.currentTab > 4) {
this.setData({
scrollLeft: 300
})
} else {
this.setData({
scrollLeft: 0
})
}
},
这样简单的顶部tab滑动效果就出来了。附上样式:
/*顶部切换*/
.tab-h {
height: 80rpx;
width: 100%;
box-sizing: border-box;
overflow: hidden;
line-height: 80rpx;
background: #f7f7f7;
font-size: 16px;
white-space: nowrap;
position: fixed;
top: 0;
left: 0;
z-index: 99;
}
.tab-item {
margin: 0 36rpx;
display: inline-block;
}
.tab-item.active {
color: #4675f9;
position: relative;
}
.tab-item.active:after {
content: "";
display: block;
height: 8rpx;
width: 54rpx;
background: #4675f9;
position: absolute;
bottom: 0;
left: 5rpx;
border-radius: 16rpx;
}
接着说侧边栏点击
侧边栏效果图
就想购物商城的分类点击一样。这里主要用到的就是官方的框架:数据绑定、列表渲染、条件渲染
具体在代码中是这样用到的:
<!--主盒子-->
<view class="containers">
<!--左侧栏-->
<view class="nav_left">
<block wx:for="{{cateItems}}" wx:key="">
<view class="nav_left_items {{curNav == item.cate_id ? 'active' : ''}}" bindtap="switchRightTab" data-index="{{index}}" data-id="{{item.cate_id}}">{{item.cate_name}}</view>
</block>
</view>
<!--右侧栏-->
<view class="nav_right">
<!--如果有数据,才遍历项-->
<view wx:if="{{cateItems[curIndex].ishaveChild}}">
<block wx:for="{{cateItems[curIndex].children}}" wx:key="">
<view class="nav_right_items">
<!--界面跳转 -->
<navigator url="">
<image src="{{item.image}}"></image>
<text>{{item.name}}</text>
</navigator>
</view>
</block>
</view>
<!--如果无数据,则显示数据-->
<view class="nodata_text" wx:else>该分类暂无数据</view>
</view>
</view>
左侧是一个部分,需要用列表渲染 wx:for="{{cateItems}}",将左侧的各个分类用一个列表展示出来,{{cateItems}}是一个数组。对应分类的点击添加样式我们仍然用三目运算判断{{curNav == item.cate_id ? ‘active’ : ‘’}}"。左侧分类的item我们写在JS中
cateItems: [{
cate_id: 1,
cate_name: "公共程序",
ishaveChild: true,
children:[{}]
},
{
cate_id: 2,
cate_name: "公共策划",
ishaveChild: true,
children:[{}]
},
{
cate_id: 3,
cate_name: "郑州项目",
ishaveChild: true,
children:[{}]
},
{
cate_id: 4,
cate_name: "成都项目",
ishaveChild: true,
children:[{}]
},
{
cate_id: 5,
cate_name: "三方客服",
ishaveChild: true,
children:[{}]
}
],
curNav: 1,
curIndex: 0,
这部分仍然是在公共data中实现,有人会说能否获取服务器内容来填充呢,当然可以实现,这就需要你请求接口,然后存贮data,道理是一样的。
可以看到在分类的item中都给了id值,这也是必须的一步,因为要确保点击对应的分类来实现显示对应的内容,添加对应的样式,所以给上id来排序号。
当然在代码中也要全部列出item的内容。
<view class="nav_left_items {{curNav == item.cate_id ? 'active' : ''}}" bindtap="switchRightTab" data-index="{{index}}" data-id="{{item.cate_id}}">{{item.cate_name}}</view>
对应的方法我们要在JS中配置出来:
//部门列表点击
switchRightTab: function(e) {
// 获取item项的id,和数组的下标值
let id = e.target.dataset.id,
index = parseInt(e.target.dataset.index);
// 把点击到的某一项,设为当前index
this.setData({
curNav: id,
curIndex: index
})
},
有了这个点击函数就可以展示对应的内容了。
还有一步我做简单说明:
<view wx:if="{{cateItems[curIndex].ishaveChild}}">
<block wx:for="{{cateItems[curIndex].children}}" wx:key="">
这个列表渲染wx:if="{{cateItems[curIndex].ishaveChild}},就是判断当前分类是否被点击到,点击到ishaveChild的值是true的就展示对应的内容。wx:for="{{cateItems[curIndex].children}}",则是请求item的children内容。children也可以用请求服务器内容来实现,同样是把请求到的数据储存到本地,然后给页面渲染出来。
curNav: 1,
curIndex: 0,
这两个值是初始化内容,就是默认是列表的第一个内容优先展示。
好了本期就说这些,有不懂的可以留言。


小程序开发顶部TAB栏和侧边分类点击的更多相关文章
- 微信小程序开发——文本框种输入手机号,点击获取验证码无反应的处理方法
异常描述: 如下图,输入手机号码之后,点击右侧的获取验证码,在开发工具是OK的,真机测试无反应: 页面编码跟H5差不多的,H5没出现这个问题,但是小程序就不一样了. 异常分析: 页面结构层面,为了方便 ...
- 小程序开发-页面导航栏navigation-bar组件
导航栏navigation-bar 页面导航条配置节点,用于指定导航栏的一些属性.只能是 page-meta 组件内的第一个节点,需要配合它一同使用. 通过这个节点可以获得类似于调用 wx.setNa ...
- 微信小程序之顶部导航栏
wxml: <!--导航条--><view class="navbar"> <text wx:for="{{navbar}}" d ...
- 微信小程序开发学习资料
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 微信小程序开发之初探
本文是以一个简单的小例子,来简要讲解微信小程序开发步骤,希望促进学习分享. 概念 微信小程序,简称小程序,缩写xcx,英文mini program.是一种不需要下载安装即可使用的应用,它实现了应用“触 ...
- 微信小程序开发环境安装以及相关设置配置
微信小程序开发环境安装以及相关设置配置 一.安装 软件名称:wechat_devtools_1.02.1907232_x64 软件安装地址:https://developers.weixin.qq.c ...
- 微信小程序开发日记——高仿知乎日报(上)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 【微信小程序开发】全局配置
今天看看小程序全局配置. 上一篇[微信小程序开发]秒懂,架构及框架 配置,无非就是为了增加框架的灵活性,而定下的规则. 微信小程序的配置文件是一个树状结构,各个节点代表不同的配置项,小程序框架会解析这 ...
- 微信小程序-开发入门(一)
微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应用场景(用完即走和二维码分发等)还是很值 ...
随机推荐
- 「Luogu4556」Vani有约会-雨天的尾巴
「Luogu4556」Vani有约会-雨天的尾巴 传送门 很显然可以考虑树上差分+桶,每次更新一条链就是把这条链上的点在桶对应位置打上 \(1\) 的标记, 最后对每个点取桶中非零值的位置作为答案即可 ...
- Python 基础之循环结构for及break pass continue
一.for 循环 #循环 变量 迭代 都是一个意思#把列表里面的元素意义的拿出来就是遍历listvar = ["one","two","three&q ...
- C++11并发编程2------线程管理
本节内容: 启动一个线程 每个程序都至少会有一个线程,main函数是执行入口,我们称之为主线程,其余子线程有各自的入口函数,主线程和子线程同时运行.子线程在std::thread对象创建时启动. 1. ...
- Flutter | 状态管理特别篇——Provide
前言 今天偶然发现在谷歌爸爸的仓库下出现了一个叫做flutter-provide的状态管理框架,2月8日才第一次提交,非常新鲜.在简单上手之后感觉就是一个字--爽!所以今天就跟大家分享一下这个新的状态 ...
- Java程序员常用工具类库
有人说当你开始学习Java的时候,你就走上了一条不归路,在Java世界里,包罗万象,从J2SE,J2ME,J2EE三大平台,到J2EE中的13中核心技术,再到Java世界中万紫千红的Framework ...
- sqlserver 取数据常用
sqlDataReader: public SqlDataReader GetAuth_CourtListByAuth(int autIntNo) { // Create Instance of Co ...
- CSS盒模型的组成部分及实际大小
盒模型的组成? 盒模型由内容区域.内边距.边框.外边距四部分组成. 盒模型实际大小? 盒模型实际大小由内容区域.内边距.边框三部分组成. 盒模型的box-sizing属性? 如果对盒子不进行设置(或者 ...
- Wordpress综合检测和爆破工具
WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站. 也可以把 WordPress当作一个内容管理系统(CMS)来使用.WordP ...
- 视频游戏的连击 [USACO12JAN](AC自动机+动态规划)
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的 ...
- 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ
题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...