解决微信小程序自定义tabar点击两次图标才能选中状态

关于配置自定义tab-bar的方法可以参考微信官方文档

现有需求:小程序用户有三种身份(首页、订单、我的),根据不同用户身份显示不同的tabbar

实际效果如下图:
在这里插入图片描述
在这里插入图片描述

1、新建custom-tab-bar文件夹

在这里插入图片描述

index.js文件:

Component({
  data: {
    selected: 0,
    color: "#7A7E83",
    selectedColor: "#ff0000",
    allList: [{
      list1: [{
          "pagePath": "/pages/index/index",
          "iconPath": "/images/tabs/1-1.png",
          "selectedIconPath": "/images/tabs/1.png",
          "text": "首页"
        },
        {
          "pagePath": "/pages/mall/mall",
          "iconPath": "/images/tabs/4.png",
          "selectedIconPath": "/images/tabs/4-1.png",
          "text": "订单"
        },
        {
          "pagePath": "/pages/my/my",
          "iconPath": "/images/tabs/5.png",
          "selectedIconPath": "/images/tabs/5-1.png",
          "text": "我的"
        }
      ],
      list2: [
        {
          "pagePath": "/pages/mall/mall",
          "iconPath": "/images/tabs/4.png",
          "selectedIconPath": "/images/tabs/4-1.png",
          "text": "订单"
        },
        {
          "pagePath": "/pages/my/my",
          "iconPath": "/images/tabs/5.png",
          "selectedIconPath": "/images/tabs/5-1.png",
          "text": "我的"
        }
      ]
    }],
    list:[]
  },
  attached() {
    // 这里是通过获取登录成功后,是某个角色身份,根据登录角色不同,显示不同底部导航栏
    const roleId = const roleId = wx.getStorageSync('statu')
    if (roleId == 20) {
      this.setData({
        list: this.data.allList[0].list1
      })
    } else {
      this.setData({
        list: this.data.allList[0].list2
      })
    }
  },
  methods: {
    switchTab(e) {
      const data = e.currentTarget.dataset
      wx.switchTab({
        url: data.path
      })
      this.setData({
        selected: data.index
      })
    }
  }
})

说明:

首先,小程序tabbar只识别list里面的东西

先在data中定义一个list和allList数组,把三重身份用户的list分别定义为list1,list2,list3,放入allList

const roleId = wx.getStorageSync('statu') 获取用户信息存到缓存中,根据不同和的roleId来判断是什么身份,

this.setData({ list: this.data.allList[0].list2 }) 根据身份把allList里面的子数组赋值给系统默认识别的`list``

switchTab的作用根据不同的路径切换tabbar下标

index.wxml文件:

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

index.wxss文件:

.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 .cover-image {
  width: 44rpx;
  height: 44rpx;
}

.tab-bar-item .cover-view {
  margin-top: 8rpx;
  font-size: 24rpx;
}
2、使用方法:

app.json里面加入custom:true

在这里插入图片描述
注意: 凡是用到tabbar的页面对应的xxx.jsonshow:function(){}都要按照以下进行设置,不然会出现tabbar显示与点击不同步的现象

在这里插入图片描述

代码块如下:

onShow() {
    if (this.getTabBar && 
      this.getTabBar()) {
      this.getTabBar().setData({
        selected: 0 //这里的数字是对应底部导航栏的下标,从0-2,比如“首页”模块的这里写0,“订单”模块这里写1,“我的”模块写2
      })
    }
  },
      
//selected: 0就是选中的tabbar下标,根据不同页面显示不同tabbar下标

说明: 之所以写这篇文章,主要是为了解决点击图标两次才能被选中,为了解决这个问题,查了很多别人的文章,发现都是跟官方一样,写的很片面,实际亲测还是没用解决点击两次图片才被选中的问题,因为他们的判断跟我这个判断不同,亲测,按照我这样写就没事,不用点击2次才被选中,下面是他们的写法:

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    if (typeof this.getTabBar === 'function' &&
      this.getTabBar()) {
      this.getTabBar().setData({
        selected: 0
      })
    }
  },

//selected: 0就是选中的tabbar下标,根据不同页面显示不同tabbar下标

最后希望能帮助到大家!记得点赞收藏哦谢谢!

### 微信小程序自定义 TabBar 样式教程 在微信小程序开发中,通过自定义 TabBar 可以实现更加灵活和个性化的界面设计。以下是关于如何修改和自定义 TabBar 样式的详细说明。 #### 1. 配置 `app.json` 文件 为了启用自定义 TabBar,在 `app.json` 中需要添加 `"custom": true` 属性到 `tabBar` 对象中[^2]。这会告诉框架使用开发者提供的自定义组件来替代默认的 TabBar 渲染逻辑。 ```json { "tabBar": { "custom": true, "color": "#999", "selectedColor": "#3cc51f", "backgroundColor": "#fff", "borderStyle": "black", "list": [ { "pagePath": "pages/home/index", "text": "首页" }, { "pagePath": "pages/user/index", "text": "我的" } ] } } ``` #### 2. 创建自定义 TabBar 组件 创建一个名为 `custom-tab-bar` 的文件夹,并在其内部放置必要的文件:`index.js`, `index.json`, `index.wxml`, 和 `index.wxss`[^4]。 ##### 2.1 `index.js` 此文件用于处理 TabBar 的交互逻辑以及页面跳转功能。 ```javascript Component({ options: { multipleSlots: true // 支持多插槽 }, properties: {}, data: { selected: 0, // 默认选中的索引 color: '#999', selectedColor: '#3cc51f', list: [{ pagePath: 'pages/home/index', text: '首页' }, { pagePath: 'pages/user/index', text: '我的' } ] }, methods: { switchTab(e) { const data = e.currentTarget.dataset; const url = data.path; wx.switchTab({ url: '/'+url }); } } }); ``` ##### 2.2 `index.json` 无需特别复杂的配置,只需保持基础结构即可: ```json {} ``` ##### 2.3 `index.wxml` 这是用来描述 TabBar 外观的部分,可以自由调整布局、图标大小和其他视觉效果。 ```html <view class="tab-bar"> <block wx:for="{{list}}" wx:key="*this"> <view class="tab-item {{selected === index ? 'active' : ''}}" bindtap="switchTab" data-path="{{item.pagePath}}"> <text>{{item.text}}</text> </view> </block> </view> ``` ##### 2.4 `index.wxss` 在此处定义样式规则,使 TabBar 更具吸引力并匹配整体 UI 设计风格。 ```css .tab-bar { display: flex; justify-content: space-around; background-color: #ffffff; border-top: 1px solid #ebebeb; } .tab-item { padding: 8px 0; font-size: 14px; color: #999; } .active { color: #3cc51f !important; /* 当前选中项的颜色 */ } ``` #### 3. 控制 TabBar 显示与隐藏 如果某些场景下希望动态显示或隐藏 TabBar,则可以通过条件渲染完成这一目标[^1]。 ```wxml <view hidden="{{!showTabBar}}"> <!-- 自定义 TabBar --> </view> ``` 其中变量 `showTabBar` 能够由父级页面传递给子组件或者全局管理状态决定其值。 #### 4. 设置 TabBar选中状态 当切换不同页面时,需同步更新当前激活的状态。通常情况下会在初始化阶段读取路由参数从而确定初始位置[^3]。 --- ### 结论 以上就是有关于微信小程序中如何自定义 TabBar 并修改样式的具体方法。它不仅允许更改颜色、字体等基本属性,还支持更复杂的功能扩展如基于用户角色定制化导航条内容[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值