微信小程序 - - - - - custom-tab-bar使用自定义tabbar

1. 创建custom-tab-bar组件

在这里插入图片描述
各个文件代码如下
/custom-tab-bar/data.js

export default [{
    text: '流水笺',
    iconPath: '/assets/icon/bill.png',
    selectedIconPath: '/assets/icon/bill_actived.png',
    url: '/pages/notes/index',
  },
  {
    text: '星辰图',
    iconPath: '/assets/icon/charts.png',
    selectedIconPath: '/assets/icon/charts_actived.png',
    url: '/pages/star-chart/index',
  },
  {
    text: '时光账',
    iconPath: '/assets/icon/detail.png',
    selectedIconPath: '/assets/icon/detail_actived.png',
    url: '/pages/chronicle-ledger/index',
  },
  {
    text: '心灵岛',
    iconPath: '/assets/icon/mine.png',
    selectedIconPath: '/assets/icon/mine_actived.png',
    url: '/pages/soul-island/index',

  },
];

/custom-tab-bar/index.js

import TabMenu from './data';
console.log('TabMenu', TabMenu)
Component({
  data: {
    selected: 0,
    list: TabMenu,
  },

  methods: {
    onChange(event) {
      const url = event.detail.value
      this.setData({
        selected: url
      });
      wx.switchTab({
        url
      })
    },

    init() {
      const page = getCurrentPages().pop();
      const route = page ? page.route.split('?')[0] : '';
      const selected = this.data.list.findIndex(
        (item) =>
        (item.url.startsWith('/') ? item.url.substr(1) : item.url) ===
        `${route}`,
      );
      this.setData({
        selected
      });
    },
  },
});

/custom-tab-bar/index.json

{
  "component": true,
  "usingComponents": {
    "t-tab-bar": "tdesign-miniprogram/tab-bar/tab-bar",
    "t-tab-bar-item": "tdesign-miniprogram/tab-bar-item/tab-bar-item",
    "t-icon": "tdesign-miniprogram/icon/icon"
  }
}

/custom-tab-bar/index.wxml

<t-tab-bar class="custom-tab-bar tab-bar" value="{{selected}}" bindchange="onChange" split="{{false}}">
  <t-tab-bar-item wx:for="{{list}}" wx:for-item="item" wx:for-index="index" wx:key="index">
    <view class="custom-tab-bar-wrapper">
      <image class="icon" src="{{selected == index ?item.selectedIconPath: item.iconPath}}" alt="" />
      <view class="text">{{ item.text }}</view>
    </view>
  </t-tab-bar-item>
</t-tab-bar>

/custom-tab-bar/index.wxss

.custom-tab-bar-wrapper {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.custom-tab-bar-wrapper .text {
  font-size: 20rpx;
}


.icon {
  width: 25px;
  height: 25px;
}

.tab-bar {
  --td-tab-bar-active-color: #9c6af1; // 修改选中icon的文案颜色
}

2. 修改app.json

app.json增加如下代码

  "tabBar": {
    "custom": true,
    "color": "#666666",
    "selectedColor": "#FF5F15",
    "backgroundColor": "#ffffff",
    "borderStyle": "black",
    "list": [{
        "pagePath": "pages/notes/index",
        "text": "流水笺"
      },
      {
        "pagePath": "pages/chronicle-ledger/index",
        "text": "星辰图"
      },
      {
        "pagePath": "pages/soul-island/index",
        "text": "时光账"
      },
      {
        "pagePath": "pages/star-chart/index",
        "text": "心灵岛"
      }
    ]
  },

3. tabbar对应页面调整

****.js
对应文件的onShow添加代码

 onShow() {
    if (typeof this.getTabBar === 'function' &&
      this.getTabBar()) {
      this.getTabBar().setData({
        selected: 2 // 控制哪一项是选中状态
      })
    }
  },


如此即可正常使用自定义tabbar
在这里插入图片描述

<think>我们正在处理关于微信小程序底部tab-bar是否支持完全自定义的问题。根据提供的引用信息,我们可以总结如下: 1.引用[2]明确指出,微信小程序支持自定义tabBar,需要在项目根目录下创建名为`custom-tab-bar`的目录,并在其中创建组件文件(包括`.json`,`.js`, `.wxml`, `.wxss`)。这符合微信小程序官方文档的要求。2.引用[1]展示了在`custom-tab-bar`目录下的`index.json`文件中如何配置使用自定义组件(如使用tdesign-miniprogram的组件)来构建自定义tabbar。3.引用[3]则提到了在uniapp开发微信小程序使用自定义tabbar的注意事项,特别是在页面中如何通过`this.$mp.page`或`this.$scope`来调用`getTabBar`方法设置选中状态。因此,微信小程序的底部tab-bar是支持完全自定义的,但需要遵循特定的目录结构和配置方法。**回答结构:**1.首先直接回答用户的问题:支持完全自定义。 2.简要说明自定义tabbar的基本要求(目录结构、文件要求)。 3.可以简要提及如何配置和使用的关键点(如引用中的示例)。4.根据用户可能的需求,生成相关问题。 **注意:**由于用户的问题是关于是否支持,所以重点在于确认支持并给出官方要求的概述,不需要深入代码细节,除非用户进一步询问。 **生成相关问题:**考虑到用户询问的是是否支持,接下来可能关心如何实现、注意事项等。**最终回答:**</think>### 微信小程序 tab-bar 是否支持完全自定义? 是的,微信小程序底部 tab-bar **支持完全自定义**。根据微信小程序官方文档[^2],开发者可通过创建特定目录结构和组件文件实现完全自定义tab-bar,具体要点如下: --- #### ✅ 自定义实现核心步骤 1. **目录结构要求** 必须在项目根目录下创建 **固定名称的目录 `custom-tab-bar`**(名称不可修改)[^2],包含以下文件: ```markdown custom-tab-bar/ ├── index.js # 组件逻辑 ├── index.json # 组件配置 ├── index.wxml # 组件模板 └── index.wxss # 组件样式 ``` 2. **组件配置示例** 在 `index.json` 中声明自定义组件(支持第三方组件库)[^1]: ```json { "component": true, "usingComponents": { "t-tab-bar": "tdesign-miniprogram/tab-bar/tab-bar", "t-tab-bar-item": "tdesign-miniprogram/tab-bar-item/tab-bar-item" } } ``` 3. **关键逻辑实现** - **选中状态同步**:在页面 `onShow` 生命周期中调用 `getTabBar().setData()` 更新选中项[^3]。 - **跨框架兼容**:在 uni-app 中需通过 `this.$mp.page` 或 `this.$scope` 访问原生方法[^3]: ```javascript onShow() { if (this.$scope.getTabBar?.()) { this.$scope.getTabBar().setData({ selected: 0 }); } } ``` --- #### ⚠️ 注意事项 1. **目录命名强制约束** 目录必须命名为 `custom-tab-bar`,否则无法生效[^2]。 2. **功能完整性** 自定义 tab-bar 需自行实现所有交互逻辑(如切换动画、红点提示等)。 3. **性能影响** 完全自定义可能增加包体积,需注意渲染性能优化。 > ⚡️ **官方能力文档**: > 详见微信小程序官方文档 [基础能力 / 自定义 tabBar](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html) --- ### 相关问题 1. 自定义 tab-bar 如何实现图标动态切换效果? 2. 在 uni-app 中开发自定义 tab-bar 有哪些常见兼容性问题? 3. 自定义 tab-bar 与原生 tab-bar 在性能上有何差异? [^1]: 微信小程序使用自定义组件构建 tab-bar 的配置示例 [^2]: 微信小程序自定义 tab-bar 的目录结构强制要求 [^3]: uni-app 中调用原生 tab-bar 方法的兼容性方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值