当前位置: 首页 > news >正文

小程序Taro框架 自定义底部Tabbar,处理自定义Tab栏切换卡顿、闪烁

最终效果

最近在用Taro框架开发一个小程序,有一个自定义底部Tabbar的需求,最终效果如下

起步

 这页是我第一次接触自定义小程序底部Tabbar,所有第一选择必然是相看官方文档:微信小程序自定义 Tabbar | Taro 文档 (如果第一次做,请一定要仔细看这个文档

按照文档正常配置app.config.js

app.config.js

export default {tabBar: {custom: true,color: '#000000',selectedColor: '#000000',backgroundColor: '#000000',list: [{pagePath: 'page/home/index',text: '组件',},{pagePath: 'page/cart/index',text: '接口',},],},
}

配置tab页面usingComponents

page/home/index.config.js

export default {navigationBarTitleText: '教材',usingComponents: {},
}

page/cart/index.config.js

export default {navigationBarTitleText: '购物车',usingComponents: {},
}

 开发 custom-tab-bar

设置 custom-tab-bar 组件

"component": true 

 Demo

import { Component, useState } from 'react';
import { CoverImage, CoverView } from '@tarojs/components'
import clx from 'classnames'
import Taro from '@tarojs/taro';
import { View } from '@tarojs/components';
import ic_book from '@/static/images/ic_book@2x.png';
import ic_car from '@/static/images/ic_car@2x.png';
import ic_bookHover from '@/static/images/ic_book_hover@2x.png';
import ic_carHover from '@/static/images/ic_car_hover@2x.png';
import './index.scss';
function CustomTabBar() {const [tab, setTab] = useState({color: '#000000',selectedColor: '#DC143C',list: [{pagePath: '/pages/home/index',text: '教材',iconPath: ic_book,selectedIconPath: ic_bookHover},{pagePath: '/pages/shopping-cart/index',text: '购物车',iconPath: ic_car,selectedIconPath: ic_carHover}]});function switchTab(index, url) {nx.$patch('app/setTabIndex', index);Taro.switchTab({ url });}return (<CoverViewclassName="tab-bar"style={{ height: nx.$get('app.tabHeight') + 'px' }}><CoverView className="tab-bar-border"></CoverView>{tab.list.map((item, index) => {return (<CoverViewkey={index}className="tab-bar-item"onClick={() => switchTab(index, item.pagePath)}><CoverView className="ra"><CoverImageclassName="cover-image"src={nx.$use('app.tabIndex') === index? item.selectedIconPath: item.iconPath}/>{index === 1 && (<CoverView className={clx('null-dot', {'dot': nx.$use('cart.count'),})}>{nx.$use('cart.count')}</CoverView>)}</CoverView><CoverViewclassName="cover-view"style={{color:nx.$use('app.tabIndex') === index? tab.selectedColor: tab.color}}>{item.text}</CoverView></CoverView>);})}</CoverView>);
}
export default CustomTabBar;

注意点:

  1. 上述代码中出现的nx是我同事基于Redux Toolkit 封装的一个语法糖,你可以忽略,直接理解为你自己全局状态的使用

修复自定义tab点击卡顿、闪烁

请在每个tab页面中调用如下代码,更新tab

home

 const page = useMemo(() => Taro.getCurrentInstance().page, []);useDidShow(() => {const tabbar = Taro.getTabBar<any>(page);tabbar?.setSelected(0); });

cart

 const page = useMemo(() => Taro.getCurrentInstance().page, []);useDidShow(() => {const tabbar = Taro.getTabBar<any>(page);tabbar?.setSelected(1); });

以上就是我自定义tab的大致过程,详细细节还需要你自己去看文档,官方有相关示例,只要有耐心,你一定可以做的更好

已下是Taro官方的示例 

react: 

https://github.com/NervJS/taro/tree/main/examples/custom-tabbar-react

vue 

https://github.com/NervJS/taro/tree/main/examples/custom-tabbar-vue3

相关文章:

  • 华为配置智能升级功能升级设备示例
  • 【C++ Primer Plus学习记录】break和continue语句
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • 通过vue ui创建项目
  • IntelliJ IDEA 下载安装及配置使用教程
  • C#中的线程以及[STAThread]、COM(Component Object Model)
  • 985硕的4家大厂实习与校招经历专题分享(part1)
  • ChatGPT提问技巧——控制温度和TOP-P样本
  • 2024年 Python面试热点
  • Python实现选择排序算法
  • Java方法重载
  • 基于Spring Boot + Vue的信息化在线教学平台
  • 爬虫学习笔记-requests爬取NBA得分榜
  • 2023年甘肃省职业院校技能大赛高职组“信息安全管理与评估”(赛项样卷A)
  • 计算机基础专升本笔记-汇总笔记(一)常考特征、特性、属性
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • css属性的继承、初识值、计算值、当前值、应用值
  • dva中组件的懒加载
  • GraphQL学习过程应该是这样的
  • js继承的实现方法
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nginx 配置多 域名 + 多 https
  • session共享问题解决方案
  • spring学习第二天
  • 给初学者:JavaScript 中数组操作注意点
  • 计算机在识别图像时“看到”了什么?
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #{}和${}的区别是什么 -- java面试
  • #vue3 实现前端下载excel文件模板功能
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (31)对象的克隆
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)学习JVM —— 垃圾回收机制
  • (三)mysql_MYSQL(三)
  • (一)RocketMQ初步认识
  • ***利用Ms05002溢出找“肉鸡
  • . Flume面试题
  • .bashrc在哪里,alias妙用
  • .net 受管制代码
  • .NET大文件上传知识整理
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • /bin/rm: 参数列表过长"的解决办法
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @Data注解的作用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ 第一章] JavaScript 简史
  • [1127]图形打印 sdutOJ
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [AIGC] 如何建立和优化你的工作流?
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C#]C# winform部署yolov8目标检测的openvino模型