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

curNav: 1,
 curIndex: 0,

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

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

在这里插入图片描述在这里插入图片描述

posted @ 2018-09-19 08:54  沉默的小猴子  阅读(1628)  评论(0编辑  收藏  举报