先上一个效果图:



根据这个效果图我来说内容。

首先是顶部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}}",则是请求itemchildren内容。children也可以用请求服务器内容来实现,同样是把请求到的数据储存到本地,然后给页面渲染出来。

curNav: 1,
curIndex: 0,

这两个值是初始化内容,就是默认是列表的第一个内容优先展示。

好了本期就说这些,有不懂的可以留言。

小程序开发顶部TAB栏和侧边分类点击的更多相关文章

  1. 微信小程序开发——文本框种输入手机号,点击获取验证码无反应的处理方法

    异常描述: 如下图,输入手机号码之后,点击右侧的获取验证码,在开发工具是OK的,真机测试无反应: 页面编码跟H5差不多的,H5没出现这个问题,但是小程序就不一样了. 异常分析: 页面结构层面,为了方便 ...

  2. 小程序开发-页面导航栏navigation-bar组件

    导航栏navigation-bar 页面导航条配置节点,用于指定导航栏的一些属性.只能是 page-meta 组件内的第一个节点,需要配合它一同使用. 通过这个节点可以获得类似于调用 wx.setNa ...

  3. 微信小程序之顶部导航栏

    wxml: <!--导航条--><view class="navbar"> <text wx:for="{{navbar}}" d ...

  4. 微信小程序开发学习资料

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  5. 微信小程序开发之初探

    本文是以一个简单的小例子,来简要讲解微信小程序开发步骤,希望促进学习分享. 概念 微信小程序,简称小程序,缩写xcx,英文mini program.是一种不需要下载安装即可使用的应用,它实现了应用“触 ...

  6. 微信小程序开发环境安装以及相关设置配置

    微信小程序开发环境安装以及相关设置配置 一.安装 软件名称:wechat_devtools_1.02.1907232_x64 软件安装地址:https://developers.weixin.qq.c ...

  7. 微信小程序开发日记——高仿知乎日报(上)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  8. 【微信小程序开发】全局配置

    今天看看小程序全局配置. 上一篇[微信小程序开发]秒懂,架构及框架 配置,无非就是为了增加框架的灵活性,而定下的规则. 微信小程序的配置文件是一个树状结构,各个节点代表不同的配置项,小程序框架会解析这 ...

  9. 微信小程序-开发入门(一)

    微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应用场景(用完即走和二维码分发等)还是很值 ...

随机推荐

  1. 61二叉搜索树的第k个结点

    题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路:二叉搜索树的中序遍历是递增的序列,使用 ...

  2. Python 基础之if if else

    1.代码块 以冒号作为开始,用缩进来划分区域,这个整体叫做代码块 if 5 == 5:   print(1)   print(2)   if True:   print(3)   print(4)   ...

  3. Python 基础之递归 递归函数 尾递归 斐波那契

    1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n):    print(n)    if n > 0:        digui(n- ...

  4. smoj2806建筑物

    题面 有R红色立方体,G绿色立方体和B蓝色立方体.每个立方体的边长是1.现在有一个N × N的木板,该板被划分成1×1个单元.现在要把所有的R+G+B个立方体都放在木板上.立方体必须放置在单元格内,单 ...

  5. MySQL操作之DDL

    目录 SQL语句的分类 DDL语句 SQL语句的分类 DDL(Data Definition Languages)语句:数据定义语言.这些语句定义了不同的数据段. 数据库.表.列.索引等数据库对象的定 ...

  6. LeetCode 349,350 数组的交集

    LeetCode 349: package com.lt.datastructure.Set; import java.util.ArrayList; import java.util.LinkedH ...

  7. oracle练习-day02

    .查询员工表和部门表.查询出雇员的编号,姓名,部门的编号和名称,地址.查询出每个员工的上级领导.在上一个例子的基础上查询该员工的部门名称.在上一个例子的基础上查询员工工资等级和他的上级领导工资等级.查 ...

  8. Thymeleaf--起步

    Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完 ...

  9. java中二进制反码补码的理解

    7句真言 1,二进制最高位是符号位 0正数 1负数 2,正数的原码,反码,补码都一样 3负数的原码反码 补码 (符号位不变,其他的位数取反 0->1 1->0) 4 0的反码补码都是0 5 ...

  10. 内核MKDEV(MAJOR, MINOR)

    版本:linux-2.6.24.4 宏: MKDEV(MAJOR, MINOR);   说明: 获取设备在设备表中的位置. MAJOR   主设备号 MINOR   次设备号     内核使用的版本号 ...