微信小程序自定义tabBar简易实现


1.app.json设置custom为true开启自定义

在这里插入图片描述

2.根目录创建自定义的tab文件

在这里插入图片描述

index.wxml


<view class="tab-bar">
  <view class="tab-bar-border"></view>
  <view wx:for="{
    {list}}" wx:key="index" class="tab-bar-item" data-path="{
    {item.pagePath}}" data-index="{
    {index}}" bindtap="switchTab">
  <view class="tab-bar-bulge"></view>
    <image src="{
    {selected === index ? item.selectedIconPath : item.iconPath}}"  class="{
    {item.diyClass}}"  mode="aspectFit"></image>
    <view style="color: { { selected === index ? selectedColor : color}}"  class="{
    {item.diyClass}}">{
  {item.text}}</view>
  </view>
</view>

index.json

{
   
  "component": true
}

index.js

Component({
   
  data: {
   
    selected: 0,
    color: "#7A7E83",
    selectedColor: "#3cc51f",
    list: [{
   
        pagePath: "/index/index",
        iconPath: "/image/icon_component.png",
        selectedIconPath: "/image/icon_component_HL.png",
        text: "组件"
      }, {
   
        pagePath: "/index/index3",
        iconPath: "/image/scan-svgrepo-com.png",
        selectedIconPath: "/image/scan-svgrepo-com.png",
        text: "扫码",
        diyClass: "diy"
      },
      {
   
        pagePath: "/index/index2",
        iconPath: "/image/icon_API.png",
        selectedIconPath: "/image/icon_API_HL.png",
        text: "接口"
      }
    ]
  },
  attached() {
   },
  methods: {
   
    switchTab(e) {
   
      const data = e.currentTarget.dataset
      const url = data.path
      console.log(data)
      if (data.index == 1) {
   
        wx.scanCode({
   
          success: (e) => {
   
            console.log(e)
          }
        })
        this.setData({
   
          selected: data.index
        })
      } else {
   
        wx.switchTab({
   
          url
        })
      }
    }
  }
})

index.css

/* .tab-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: 48px;
  background: white;
  display: flex;
  padding-bottom: env(safe-area-inset-bottom);
}

.tab-bar-border {
  background-color: rgba(0, 0, 0, 0.33);
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 1px;
  transform: scaleY(0.5);
}

.tab-bar-item {
  flex: 1;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.tab-bar-item image {
  width: 27px;
  height: 27px;
}
mtrj
.tab-bar-item view {
  font-size: 10px;
}
 */





/* ------------ */

/*重新样式*/
.tab-bar {
   
	position: fixed;
	bottom: 0;
	left: 0;
	right: 0;
	display: flex;
	box-sizing: content-box;
	background-color: transparent;
}
 
.tab-bar-bg {
   
	width: 100%;
	height: 140rpx;
}
 
.tab-bar-icon {
   
	display: flex;
	position: absolute;
	justify-content: space-between;
	width: 100%;
}
 
.tab-bar-border {
   
  background-color: rgba(0, 0, 0, 0.33);
  position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	height: 1px;
	transform: scaleY(0.5);
}
 
.tab-bar-item {
   
	flex: auto;
	text-align: center;
	display: flex;
	justify-content: center;
	align-items: center;
	flex-direction: column;
	background-color: transparent;
	height: 120rpx;
}
 
.tab-bar-item.bm {
   
	margin-top: 0 !important;
	background: transparent;
	position: relative;
	flex: inherit;
	width: 134rpx;
}
 
.tab-bar-item image {
   
	width: 48rpx;
	height: 48rpx;
	overflow: initial;
}
 
.tab-bar-item view {
   
	font-size: 24rpx;
}
 
.tab-bar-item image.diy {
   
  position: absolute;
  width: 108rpx;
  height: 114rpx;
  bottom: 50%;
  z-index: 100;
}
 
.tab-bar-item view.diy {
   
	background: transparent;
	width: 100%;
	height: 100%;
	padding-top: 73rpx;
	z-index: 99;
}

3.app.js全局封装一个设置tabbar选中的方法

App({
   
  onLaunch: function () {
   },
  //设置tabbar的选中
  getCurrentTabbar(selected, that) {
   
    if (typeof that.getTabBar === 'function' &&
      that.getTabBar()) {
   
      that.getTabBar().setData({
   
        selected: selected
      })
    }
  },
})

4.在onshow中使用选中方法

// index/index3.js
const app= getApp();
Page({
   

  /**
   * 页面的初始数据
   */
  data: {
   

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
   
    app.getCurrentTabbar(1,this);
  },

如果是componet的页面就直接再show中自己定义它的selected代表当前的选中态

Component({
   
  pageLifetimes: {
   
    show() {
   
      if (typeof this.getTabBar === 'function' &&
        this.getTabBar()) {
   
        this.getTabBar().setData({
   
          selected: 0
        })
      }
    }
  }
})

最终效果预览

请添加图片描述

相关推荐

  1. 程序-定义简易顶部导航

    2023-12-05 16:26:06       18 阅读
  2. 程序定义组件

    2023-12-05 16:26:06       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 16:26:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 16:26:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 16:26:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 16:26:06       18 阅读

热门阅读

  1. JVM 常识

    2023-12-05 16:26:06       40 阅读
  2. GORM gorm.DB 对象剖析

    2023-12-05 16:26:06       30 阅读
  3. 基于c 实现 FIFO

    2023-12-05 16:26:06       34 阅读
  4. 服务器固件

    2023-12-05 16:26:06       33 阅读
  5. 深入浅出 Golang 中的直接依赖和间接依赖管理

    2023-12-05 16:26:06       29 阅读
  6. EasyExcel list<Map>批量导出多个sheet

    2023-12-05 16:26:06       39 阅读
  7. Hive进阶函数:inline() 和 struct() ,一列转多行

    2023-12-05 16:26:06       36 阅读