当前位置:   article > 正文

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

taro自定义tabbar

最终效果

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

起步

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

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

app.config.js

  1. export default {
  2. tabBar: {
  3. custom: true,
  4. color: '#000000',
  5. selectedColor: '#000000',
  6. backgroundColor: '#000000',
  7. list: [
  8. {
  9. pagePath: 'page/home/index',
  10. text: '组件',
  11. },
  12. {
  13. pagePath: 'page/cart/index',
  14. text: '接口',
  15. },
  16. ],
  17. },
  18. }

配置tab页面usingComponents

page/home/index.config.js

  1. export default {
  2. navigationBarTitleText: '教材',
  3. usingComponents: {},
  4. }

page/cart/index.config.js

  1. export default {
  2. navigationBarTitleText: '购物车',
  3. usingComponents: {},
  4. }

 开发 custom-tab-bar

设置 custom-tab-bar 组件

"component": true 

 Demo

  1. import { Component, useState } from 'react';
  2. import { CoverImage, CoverView } from '@tarojs/components'
  3. import clx from 'classnames'
  4. import Taro from '@tarojs/taro';
  5. import { View } from '@tarojs/components';
  6. import ic_book from '@/static/images/ic_book@2x.png';
  7. import ic_car from '@/static/images/ic_car@2x.png';
  8. import ic_bookHover from '@/static/images/ic_book_hover@2x.png';
  9. import ic_carHover from '@/static/images/ic_car_hover@2x.png';
  10. import './index.scss';
  11. function CustomTabBar() {
  12. const [tab, setTab] = useState({
  13. color: '#000000',
  14. selectedColor: '#DC143C',
  15. list: [
  16. {
  17. pagePath: '/pages/home/index',
  18. text: '教材',
  19. iconPath: ic_book,
  20. selectedIconPath: ic_bookHover
  21. },
  22. {
  23. pagePath: '/pages/shopping-cart/index',
  24. text: '购物车',
  25. iconPath: ic_car,
  26. selectedIconPath: ic_carHover
  27. }
  28. ]
  29. });
  30. function switchTab(index, url) {
  31. nx.$patch('app/setTabIndex', index);
  32. Taro.switchTab({ url });
  33. }
  34. return (
  35. <CoverView
  36. className="tab-bar"
  37. style={{ height: nx.$get('app.tabHeight') + 'px' }}>
  38. <CoverView className="tab-bar-border"></CoverView>
  39. {tab.list.map((item, index) => {
  40. return (
  41. <CoverView
  42. key={index}
  43. className="tab-bar-item"
  44. onClick={() => switchTab(index, item.pagePath)}>
  45. <CoverView className="ra">
  46. <CoverImage
  47. className="cover-image"
  48. src={
  49. nx.$use('app.tabIndex') === index
  50. ? item.selectedIconPath
  51. : item.iconPath
  52. }
  53. />
  54. {index === 1 && (
  55. <CoverView className={clx('null-dot', {
  56. 'dot': nx.$use('cart.count'),
  57. })}>{nx.$use('cart.count')}</CoverView>
  58. )}
  59. </CoverView>
  60. <CoverView
  61. className="cover-view"
  62. style={{
  63. color:
  64. nx.$use('app.tabIndex') === index
  65. ? tab.selectedColor
  66. : tab.color
  67. }}>
  68. {item.text}
  69. </CoverView>
  70. </CoverView>
  71. );
  72. })}
  73. </CoverView>
  74. );
  75. }
  76. export default CustomTabBar;

注意点:

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

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

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

home

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

cart

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

以上就是我自定义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

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

闽ICP备14008679号