当前位置:   article > 正文

微信小程序 自定义 tabBar_微信小程序自定义tabbar组件

微信小程序自定义tabbar组件

自定义 tabBar | 微信开放文档

本文案例使用的Taro 非原生微信小程序

使用流程

1. 配置信息

  • 在 app.json 中的 tabBar 项指定 custom 字段,同时其余 tabBar 相关配置也补充完整。
  • 所有 tab 页的 json 里需声明 usingComponents 项,也可以在 app.json 全局开启。


    案例Taro项目文件:app.config.js:
    1. export default {
    2. pages: ['pages/hotel/index', 'pages/order/index', 'pages/room/index', 'pages/mine/index'],
    3. subPackages: [
    4. {
    5. root: 'subPages',
    6. pages: ['login/index', 'webView/index'],
    7. },
    8. ],
    9. tabBar: {
    10. custom: true,
    11. selectedColor: '#da4297',
    12. backgroundColor: '#fff',
    13. borderStyle: 'white',
    14. list: [
    15. {
    16. pagePath: 'pages/hotel/index',
    17. selectedIconPath: 'assets/img/tab/home-fill.png',
    18. iconPath: 'assets/img/tab/home-line.png',
    19. text: '首页',
    20. },
    21. {
    22. pagePath: 'pages/order/index',
    23. selectedIconPath: 'assets/img/tab/order-fill.png',
    24. iconPath: 'assets/img/tab/order-line.png',
    25. text: '订单',
    26. },
    27. {
    28. pagePath: 'pages/room/index',
    29. selectedIconPath: 'assets/img/tab/shop-fill.png',
    30. iconPath: 'assets/img/tab/shop-line.png',
    31. text: '商城',
    32. },
    33. {
    34. pagePath: 'pages/mine/index',
    35. selectedIconPath: 'assets/img/tab/mine-fill.png',
    36. iconPath: 'assets/img/tab/mine-line.png',
    37. text: '我的',
    38. },
    39. ],
    40. },
    41. };
    tabBar文件类目

2. 添加 tabBar 代码文件

代码根目录下添加入口文件:

  1. custom-tab-bar/index.js
  2. custom-tab-bar/index.json
  3. custom-tab-bar/index.wxml
  4. custom-tab-bar/index.wxss

案例:使用的Taro 非原生微信小程序

 

3. 编写 tabBar 代码

自定义组件的方式编写即可,该自定义组件完全接管 tabBar 的渲染。另外,自定义组件新增 getTabBar 接口,可获取当前页面下的自定义 tabBar 组件实例

index.jsx文件是自定义的tabBar 内容

  1. import { ClassNames, ConstantList, StorageUtil } from '@/util';
  2. import { CoverImage, CoverView } from '@tarojs/components';
  3. import { inject, observer } from 'mobx-react';
  4. import Taro from '@tarojs/taro';
  5. import React, { Component } from 'react';
  6. import './index.scss';
  7. @inject('appStore')
  8. @inject('initMod')
  9. @observer
  10. export default class StoreHome extends Component {
  11. constructor(props) {
  12. super(props);
  13. this.state = {
  14. color: '#979797',
  15. selectedColor: '#3D4DA4',
  16. // 自己定义的字段和内容
  17. list: [
  18. {
  19. pagePath: 'pages/hotel/index',
  20. selectedIconPath: '/assets/img/tab/home-fill.png',
  21. iconPath: '/assets/img/tab/home-line.png',
  22. text: '首页',
  23. },
  24. {
  25. pagePath: 'pages/order/index',
  26. selectedIconPath: '/assets/img/tab/order-fill.png',
  27. iconPath: '/assets/img/tab/order-line.png',
  28. text: '订单',
  29. requestLogin: true,
  30. },
  31. {
  32. appId: ConstantList.PASS_LOGIN_APPID,
  33. selectedIconPath: '/assets/img/tab/shop-fill.png',
  34. iconPath: '/assets/img/tab/shop-line.png',
  35. text: '商城',
  36. },
  37. {
  38. pagePath: 'pages/mine/index',
  39. // reallyPath:'/Coupon',
  40. selectedIconPath: '/assets/img/tab/mine-fill.png',
  41. iconPath: '/assets/img/tab/mine-line.png',
  42. text: '我的',
  43. requestLogin: true,
  44. },
  45. ],
  46. };
  47. }
  48. switchTab = (data, index) => {
  49. // 如果需要登录 又没有token的话,则跳转到登录页
  50. const token = Taro.getStorageSync(ConstantList.TOKEN);
  51. if (data.requestLogin && !token) {
  52. Taro.navigateTo({
  53. url: `/subPages/login/index?redirectTo=/${data.pagePath}`,
  54. });
  55. return;
  56. }
  57. if (!data.building) {
  58. // 跳转其他小程序
  59. if (data.appId) {
  60. Taro.navigateToMiniProgram({
  61. // xxxxxxxxxxx
  62. });
  63. } else if (data.reallyPath) {
  64. // 跳转H5地址 xxxx
  65. this.props.initMod.changeSelectedTab(index); // 记录当前高亮tab
  66. } else {
  67. Taro.switchTab({ url: '/' + data.pagePath });
  68. this.props.initMod.changeSelectedTab(index);
  69. }
  70. } else {
  71. Taro.showToast({
  72. title: '该功能即将开放,敬请期待',
  73. icon: 'none',
  74. duration: 1000,
  75. });
  76. }
  77. };
  78. render() {
  79. const { list, selectedColor, color } = this.state;
  80. const { selectedTab } = this.props.initMod;
  81. return (
  82. <CoverView
  83. className={ClassNames('tab-bar', {
  84. 'tab-bar_hide': this.props.appStore.state.hideTarBar
  85. })}>
  86. {list.map((item, index) => {
  87. return (
  88. <CoverView
  89. key={'tabBar' + index}
  90. className='tab-bar-item'
  91. onClick={() => {
  92. this.switchTab(item, index);
  93. }}>
  94. <CoverView className='tab-bar-box'>
  95. {item.iconPath && item.selectedIconPath && (
  96. <CoverImage
  97. className='image imageSelect'
  98. src={selectedTab === index ? item.selectedIconPath : item.iconPath}></CoverImage>
  99. )}
  100. <CoverView
  101. className='text'
  102. style={{
  103. color: selectedTab === index ? selectedColor : color,
  104. }}>
  105. {item.text}
  106. </CoverView>
  107. </CoverView>
  108. </CoverView>
  109. );
  110. })}
  111. </CoverView>
  112. );
  113. }
  114. }

index.scss tabBar样式文件

  1. .tab-bar {
  2. position: fixed;
  3. bottom: 0;
  4. left: 0;
  5. right: 0;
  6. height: $size-tabbar;
  7. background: white;
  8. display: flex;
  9. padding-bottom: env(safe-area-inset-bottom);
  10. border-radius: 28px 28px 0 0;
  11. background: #fff;
  12. box-shadow: 0 0 16px 0 rgba(0, 0, 0, 0.08);
  13. &_hide {
  14. display: none;
  15. }
  16. .tab-bar-item {
  17. flex: 1;
  18. text-align: center;
  19. display: flex;
  20. justify-content: center;
  21. align-items: center;
  22. flex-direction: column;
  23. padding: 10px 0;
  24. .tab-bar-box{
  25. width: 60px;
  26. margin: 0 auto;
  27. position: relative;
  28. .ring{
  29. position: absolute;
  30. display: block;
  31. width: 16px;
  32. height: 16px;
  33. background-color: $color-primary;
  34. border-radius: 50%;
  35. right: 0;
  36. top: 0;
  37. z-index: 20000;
  38. }
  39. }
  40. .image {
  41. width: 50px;
  42. height: 50px;
  43. margin: 0 auto;
  44. }
  45. .text {
  46. line-height: 30px;
  47. font-size: 20px;
  48. white-space: nowrap;
  49. }
  50. }
  51. }

最终自定义样式效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/751252
推荐阅读
  

闽ICP备14008679号