微信小程序 自定义 tabBar

自定义 tabBar | 微信开放文档

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

使用流程

1. 配置信息

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


    案例Taro项目文件:app.config.js:
    export default {
      pages: ['pages/hotel/index', 'pages/order/index', 'pages/room/index', 'pages/mine/index'],
      subPackages: [
        {
          root: 'subPages',
          pages: ['login/index',  'webView/index'],
        },
      ],
      tabBar: {
        custom: true,
        selectedColor: '#da4297',
        backgroundColor: '#fff',
        borderStyle: 'white',
        list: [
          {
            pagePath: 'pages/hotel/index',
            selectedIconPath: 'assets/img/tab/home-fill.png',
            iconPath: 'assets/img/tab/home-line.png',
            text: '首页',
          },
          {
            pagePath: 'pages/order/index',
            selectedIconPath: 'assets/img/tab/order-fill.png',
            iconPath: 'assets/img/tab/order-line.png',
            text: '订单',
          },
          {
            pagePath: 'pages/room/index',
            selectedIconPath: 'assets/img/tab/shop-fill.png',
            iconPath: 'assets/img/tab/shop-line.png',
            text: '商城',
          },
          {
            pagePath: 'pages/mine/index',
            selectedIconPath: 'assets/img/tab/mine-fill.png',
            iconPath: 'assets/img/tab/mine-line.png',
            text: '我的',
          },
        ],
      },
    
    };
    
    tabBar文件类目

2. 添加 tabBar 代码文件

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

custom-tab-bar/index.js
custom-tab-bar/index.json
custom-tab-bar/index.wxml
custom-tab-bar/index.wxss

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

 

3. 编写 tabBar 代码

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

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

import { ClassNames, ConstantList, StorageUtil } from '@/util';
import { CoverImage, CoverView } from '@tarojs/components';
import { inject, observer } from 'mobx-react';
import Taro from '@tarojs/taro';
import React, { Component } from 'react';
import './index.scss';

@inject('appStore')
@inject('initMod')
@observer
export default class StoreHome extends Component {
  constructor(props) {
    super(props);
    this.state = {
      color: '#979797',
      selectedColor: '#3D4DA4',
      // 自己定义的字段和内容
      list: [
        {
          pagePath: 'pages/hotel/index',
          selectedIconPath: '/assets/img/tab/home-fill.png',
          iconPath: '/assets/img/tab/home-line.png',
          text: '首页',
        },
        {
          pagePath: 'pages/order/index',
          selectedIconPath: '/assets/img/tab/order-fill.png',
          iconPath: '/assets/img/tab/order-line.png',
          text: '订单',
          requestLogin: true,
        },
        {
          appId: ConstantList.PASS_LOGIN_APPID,
          selectedIconPath: '/assets/img/tab/shop-fill.png',
          iconPath: '/assets/img/tab/shop-line.png',
          text: '商城',
        },
        {
          pagePath: 'pages/mine/index',
          // reallyPath:'/Coupon', 
          selectedIconPath: '/assets/img/tab/mine-fill.png',
          iconPath: '/assets/img/tab/mine-line.png',
          text: '我的',
          requestLogin: true,
        },
      ],
    };
  }

  switchTab = (data, index) => {
    // 如果需要登录 又没有token的话,则跳转到登录页
    const token = Taro.getStorageSync(ConstantList.TOKEN);
    if (data.requestLogin && !token) {
        Taro.navigateTo({
          url: `/subPages/login/index?redirectTo=/${data.pagePath}`,
        });
      return;
    }

    if (!data.building) {
      // 跳转其他小程序
      if (data.appId) {
        Taro.navigateToMiniProgram({
         // xxxxxxxxxxx
        });
      } else if (data.reallyPath) {
         // 跳转H5地址 xxxx
        this.props.initMod.changeSelectedTab(index); // 记录当前高亮tab
      } else {
        Taro.switchTab({ url: '/' + data.pagePath });
        this.props.initMod.changeSelectedTab(index);
      }
    } else {
      Taro.showToast({
        title: '该功能即将开放,敬请期待',
        icon: 'none',
        duration: 1000,
      });
    }
  };

  render() {
    const { list, selectedColor, color } = this.state;
    const { selectedTab } = this.props.initMod;

    return (
      <CoverView
        className={ClassNames('tab-bar', {
          'tab-bar_hide': this.props.appStore.state.hideTarBar
        })}>
        {list.map((item, index) => {
          return (
            <CoverView
              key={'tabBar' + index}
              className='tab-bar-item'
              onClick={() => {
                this.switchTab(item, index);
              }}>
              <CoverView className='tab-bar-box'>
                {item.iconPath && item.selectedIconPath && (
                  <CoverImage
                    className='image imageSelect'
                    src={selectedTab === index ? item.selectedIconPath : item.iconPath}></CoverImage>
                )}
                <CoverView
                  className='text'
                  style={{
                    color: selectedTab === index ? selectedColor : color,
                  }}>
                  {item.text}
                </CoverView>
              </CoverView>
            </CoverView>
          );
        })}
      </CoverView>
    );
  }
}

index.scss tabBar样式文件


.tab-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: $size-tabbar;
  background: white;
  display: flex;
  padding-bottom: env(safe-area-inset-bottom);
  border-radius: 28px 28px 0 0;
  background: #fff;
  box-shadow: 0 0 16px 0 rgba(0, 0, 0, 0.08);
  &_hide {
    display: none;
  }
  .tab-bar-item {
    flex: 1;
    text-align: center;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    padding: 10px 0;

    .tab-bar-box{
      width: 60px;
      margin: 0 auto;
      position: relative;
      .ring{
        position: absolute;
        display: block;
        width: 16px;
        height: 16px;
        background-color: $color-primary;
        border-radius: 50%;
        right: 0;
        top: 0;
        z-index: 20000;
      }
    }
    .image {
      width: 50px;
      height: 50px;
      margin: 0 auto;

    }
    .text {
      line-height: 30px;
      font-size: 20px;
      white-space: nowrap;
    }
  }
}
 

最终自定义样式效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/664337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[已解决]FinalShell连接CentOS失败:java.net.UnknownHostException: centos

报错&#xff1a; 解决办法&#xff1a; 1.查看Windows:C:\Windows\System32\drivers\etc\ 2.拷贝hosts文件&#xff0c;用记事本打开hosts文件 3.添加主机名centos及对应IP地址&#xff0c;保存并粘贴覆盖C:\Windows\System32\drivers\etc\中的hosts文件 4.打开cmd命令窗口输…

发成绩的小程序怎么做?

成绩的发布和管理一直是老师和家长共同关心的问题。传统的成绩发布方式往往存在效率低下、信息泄露风险等问题。有没有一种既安全又高效的解决方案呢&#xff1f; 易查分为成绩查询提供了一个理想的平台。不需要下载安装&#xff0c;用户只需通过在线查询的方式即可快速访问&am…

小程序内使用路由

一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…

HTML5的标签(文本链接、图片路径详解)

目录 前言 一、文本链接 超链接表述 二、图片路径详解 绝对路径 相对路径 网络路径 前言 一、文本链接 超链接表述 HTML 使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;…

vscode编辑器创建分支注意事项?!

最近在公司开发项目时&#xff0c;不小心将自己分支的东西提交到公司的master的分支&#xff0c;大家看看是什么情况&#xff1f; 先上图&#xff1a; 从图上看&#xff0c;我这边用了GITLENS这个插件&#xff0c;在创建分支时&#xff0c;有个create branch from&#xff0c;有…

Windows 权限维持之 Shift 后门

正常情况下我们连按五次 shift 键会弹出粘滞键 粘滞键是电脑使用中的一种快捷键&#xff0c;一般连按五次 shift 会出现粘滞键提示&#xff0c;粘滞键是专为同时按下两个或多个键有困难的人而设计的&#xff0c; 粘滞键开启后&#xff0c;可以先按一个键位&#xff0c;再按另一…

如何识别并选择正规、优质的外汇交易平台?

外汇市场的日益繁荣吸引了越来越多的投资者&#xff0c;但同时也带来了众多外汇平台的涌现。如何在这些平台中筛选出正规、可信的平台&#xff0c;成为了每位外汇交易者必须面对的首要问题。以下&#xff0c;我们将为您揭示如何鉴别外汇平台真伪的几个关键方法&#xff1a; 首先…

生成 PDF 用 Turborepo 管理,简单的事情复杂化?

最近在做一个生成报告的项目&#xff0c;稍微了解过这方面知识的同学大概都可以想到直接 HTML 写模板&#xff0c;利用 html2canvas jspdf 两个库就可以实现&#xff0c;非常简单。但是为什么我采用 Turborepo 来管理这个项目呢&#xff1f; 有兴趣的同学在看本文前应先了解一…

从了解到掌握 Spark 计算框架(二)RDD

文章目录 RDD 概述RDD 组成RDD 的作用RDD 算子分类RDD 的创建1.从外部数据源读取2.从已有的集合或数组创建3.从已有的 RDD 进行转换 RDD 常用算子大全转换算子行动算子 RDD 算子综合练习RDD 依赖关系窄依赖宽依赖宽窄依赖算子区分 RDD 血统信息血统信息的作用血统信息的组成代码…

部署k8s的DashBoard

1. 部署 Dashboard UI [rootk8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recomme nded.yaml一般上面的网站访问不了 可以下载我上传的资源DashBoard的recommended.yaml vim recommended.yaml 复制粘贴我上…

SQL查询太慢?实战讲解YashanDB SQL调优思路

本文是 Meetup 第十期 “调优实战专场” 的第二篇技术文章&#xff0c;上一篇《高效查询秘诀&#xff0c;解码 YashanDB 优化器分组查询优化手段》中&#xff0c;我们揭秘了 YashanDB 分组查询优化秘诀&#xff0c;本文将通过一个案例&#xff0c;助你快速上手 YashanDB 慢日志…

爱堡集团数智掘金—共绘上市蓝图

&#xff08;本台记者报&#xff09;2024年5月26日爱堡集团在浙江省杭州市上城区瑞莱克斯大酒店隆重召开规模达500人的盛会。这场聚焦智慧与创新的会议&#xff0c;旨在加速爱堡集团的数智化转型进程&#xff0c;并为其上市之路绘制蓝图&#xff0c;吸引了众多行业领袖和媒体的…

统信UOS桌面操作系统1070安装vmware workstation 17

原文连接&#xff1a;统信UOS桌面操作系统1070安装vmware workstation 17 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在统信UOS桌面操作系统1070上安装VMware Workstation 17.5.2的文章。VMware Workstation是一款强大的虚拟化软件&#xff0c;可以让您在一台计…

未来工厂新篇章:大型工厂3D可视化技术引领工业新潮流

在科技日新月异的今天&#xff0c;大型工厂不再是我们印象中机器轰鸣、尘土飞扬的钢铁丛林&#xff0c;而是变成了智慧与效率并存的现代化生产中心。这一切的改变&#xff0c;都离不开一项革命性的技术——3D可视化。 一、何为大型工厂3D可视化&#xff1f; 大型工厂3D可视化&…

vue3 setup 使用 beforeRouteEnter 组件内路由守卫

vue3 setup 使用 beforeRouteEnter 组件内路由守卫 setup 中只有onBeforeRouteLeave、onBeforeRouteUpdate两个钩子函数&#xff0c; 没有beforeRouteEnter对应的钩子函数&#xff0c;所以无法在setup中直接使用 <script setup> onBeforeRouteLeave((to, from) > {// …

pytorch使用tensorboardX面板自动生成模型结构图和各类可视化图像

总结&#xff1a; 在原本代码中额外添加如下几行即可实现查看模型结构&#xff1a; from tensorboardX import SummaryWriter # 用于进行可视化# 1. 来用tensorflow进行可视化with SummaryWriter("./log", comment"sample_model_visualization") as sw: …

【echarts】 渐变色格状横条图

案例来源 https://www.makeapie.cn/echarts_content/xutsGwXHGt.html 效果 源码 let list [{name: 中和,value: 6}, {name: 西园,value: 1}, {name: 肖家河,value: 0}, {name: 石羊,value: 8}, {name: 合作,value: 0},{name: 桂溪,value: 6},{name: 芳草街,value: 1} ]; le…

Navicat使用ssh隧道连接mysql数据库

转载请标明出处&#xff1a;http://blog.csdn.net/donkor_/article/details/139352748 文章目录 前言新建连接MySql,填写ssh隧道信息方式1&#xff1a;使用密码方式连接方式二&#xff1a;使用密钥方式连接 填写常规信息总结 前言 使用ssh隧道连接数据库&#xff0c;方便本机…

PS系统教程06

图片裁剪-详细版 首先勾选图层-单机裁剪工具-删除裁剪像素 背景颜色是和左边工作区颜色保持一致的。 确定选择 单机两下工作区中的√按下回车键 缩小裁剪 当你缩小裁剪之后再想扩大&#xff0c;那么扩大的部分就是背景颜色 不勾选删除裁剪像素效果&#xff08;裁剪完单机一…

Element ui 快速入门(基础知识点)

element ui官网 前言&#xff1a; 在当今时代&#xff0c;我们在编写计算机程序时&#xff0c;不仅仅是写几个增删改查的简单功能&#xff0c;为了满足广大用户对页面美观的需求&#xff0c;为了让程序员们写一些功能更简便&#xff0c;提高团队协作效率&#xff0c;所以eleme…