1.创建 组件

src/components/TabBar/index.js

  1. /**
  2. * TabBar 组件
  3. */
  4. import React ,{ PureComponent } from 'react';
  5. import classNames from 'classnames';
  6. import { Link } from 'react-router-dom';
  7. import {menuData} from '../../common/menu';
  8. import 'antd-mobile/lib/tab-bar/style/index.css';
  9. import 'antd-mobile/lib/badge/style/index.css';
  10. import Styles from './index.less';
  11.  
  12. class WxTabBar extends PureComponent {
  13. state = {
  14. selectedTab: 'home',
  15. hidden: false
  16. }
  17.  
  18. changeTab = (tab) => {
  19. this.setState({
  20. selectedTab: tab
  21. })
  22. }
  23.  
  24. // 监听 props 的变化
  25. componentWillReceiveProps(nextProps){
  26. let pathName = nextProps.location.pathname;
  27. if(pathName === '/home' || pathName === '/classify' || pathName === '/shopcar' || pathName === '/me'){
  28. this.setState({
  29. hidden:false,
  30. selectedTab:pathName.substring(1)
  31. });
  32. }else{
  33. this.setState({
  34. hidden:true
  35. });
  36. }
  37. }
  38.  
  39. render(){
  40. return (
  41. <div style={{'display': this.state.hidden ? 'none' : 'block'}} className={classNames({
  42. 'am-tabs-tab-bar-wrap':true,
  43. },Styles.container)}>
  44. <div className="am-tab-bar-bar" style={{backgroundColor:"white"}}>
  45. {
  46. menuData.map(item => (
  47. <div key={item.key} className="am-tab-bar-tab">
  48. <Link to={item.path} onClick={this.changeTab.bind(this,item.key)}>
  49. <div className="am-tab-bar-tab-icon">
  50. <span className="am-badge am-tab-bar-tab-badge tab-badge">
  51. {
  52. this.state.selectedTab === item.key?
  53. <div style={{width: "22px", height: "22px", background: `url(${item.selectedIcon}) center center / 21px 21px no-repeat`}}></div>
  54. :
  55. <div style={{width: "22px", height: "22px", background: `url(${item.icon}) center center / 21px 21px no-repeat`}}></div>
  56. }
  57. {/* <sup className="am-badge-text">1</sup> */}
  58. </span>
  59. </div>
  60. <p className="am-tab-bar-tab-title" style={{color: this.state.selectedTab === item.key?item.tintColor:item.unselectedTintColor}}>{item.name}</p>
  61. </Link>
  62. </div>
  63. ))
  64. }
  65. </div>
  66. </div>
  67. )
  68. }
  69. }
  70.  
  71. export default WxTabBar;

样式

index.less

  1. .container{
  2. position: fixed;
  3. left: 0px;
  4. bottom: 0px;
  5. width: 100%;
  6. background-color: #fff;
  7. box-sizing: border-box;
  8. }

菜单

src/common/menu.js

  1. /**
  2. * 菜单栏 数据
  3. */
  4. // 主页
  5. import home1 from '../assets/home1.png'
  6. import home2 from '../assets/home2.png'
  7. // 分类
  8. import sort1 from '../assets/sort1.png'
  9. import sort2 from '../assets/sort2.png'
  10. // 购物车
  11. import shopcar1 from '../assets/shopcar1.png'
  12. import shopcar2 from '../assets/shopcar2.png'
  13. // 我的
  14. import me1 from '../assets/me1.png'
  15. import me2 from '../assets/me2.png'
  16. /**
  17. * tabbar菜单
  18. */
  19.  
  20. const menuData = [
  21. {
  22. name:'主页',
  23. key:'home',
  24. path:'/home',
  25. icon: home1,
  26. selectedIcon:home2,
  27. unselectedTintColor:"#949494",
  28. tintColor:"#33A3F4",
  29. },
  30. {
  31. name:'分类',
  32. key:'classify',
  33. path:'/classify',
  34. icon: sort1,
  35. selectedIcon:sort2,
  36. unselectedTintColor:"#949494",
  37. tintColor:"#33A3F4",
  38. },
  39. {
  40. name:'购物车',
  41. key:'shopcar',
  42. path:'/shopcar',
  43. icon: shopcar1,
  44. selectedIcon:shopcar2,
  45. unselectedTintColor:"#949494",
  46. tintColor:"#33A3F4",
  47. },
  48. {
  49. name:'我的',
  50. key:'me',
  51. path:'/me',
  52. icon: me1,
  53. selectedIcon:me2,
  54. unselectedTintColor:"#949494",
  55. tintColor:"#33A3F4",
  56. },
  57. ]
  58.  
  59. export {
  60. menuData
  61. }

2.页面调用

  1. <WxTabBar {...this.props} />

3.效果图

react 自定义 TabBar 组件的更多相关文章

  1. weex 项目开发(四)项目框架搭建 及 自定义 TabBar 组件

    1.安装  路由模块  及  状态管理模块 npm install vue-router --save npm install vuex --save 2.自定义  TabBar  组件 src / ...

  2. 微信小程序自定义 tabbar

    一定的需求情况下,无法使用小程序原生的 tabbar 的时候,需要自行实现一个和 tabbar 功能一模一样的自制组件. 查阅了海量的博客和文档之后,亲自踩坑.总结了三种在不使用微信小程序原生 tab ...

  3. 微信小程序 - 自定义tabbar

    更新: 2019-1-18:自定义tabbar组件已发布 各种奇葩的需求,造就了我们 wxml <view class="nav-tabs"> <view cla ...

  4. 微信小程序自定义tabbar的实现

    微信小程序自定义tabbar的实现 目的:当采用微信的自定义tabbar组件的时候,切换的时候会出现闪屏的效果:当使用微信默认的tabbar的时候,限制了tabbar的数量以及灵活配置. 方案:自己动 ...

  5. 小程序基础能力~自定义 tabBar

    自定义 tabBar 基础库 2.5.0 开始支持,低版本需做兼容处理. 自定义 tabBar 可以让开发者更加灵活地设置 tabBar 样式,以满足更多个性化的场景. 在自定义 tabBar 模式下 ...

  6. taro中自定义tabbar实现中间图标凸出效果

    遇到的一个需求是在tabbar上有一个凸起的小图标, 但是微信自带的tabbar是没有这个效果的, 无奈,只能使用自定义tabbar,查找了多方文档后发现大多是原生小程序实现, 关于taro文档的少之 ...

  7. #003 React 组件 继承 自定义的组件

    主题:React组件 继承 自定义的 组件 一.需求说明 情况说明: 有A,B,C,D 四个组件,里面都有一些公用的逻辑,比如 设置数据,获取数据,有某些公用的的属性,不想在 每一个 组件里面写这些属 ...

  8. Nuxt/Vue自定义导航栏Topbar+标签栏Tabbar组件

    基于Vue.js实现自定义Topbar+Tabbar组件|仿咸鱼底部凸起导航 最近一直在倒腾Nuxt项目,由于Nuxt.js是基于Vue.js的服务端渲染框架,只要是会vue,基本能很快上手了. 一般 ...

  9. 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer

    基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ...

随机推荐

  1. 如何让ie8/ie7/ie6支持html5的<footer></footer><nav></nav>等标签

    使用他们能让代码语义化更直观,而且更方便SEO优化.但是此HTML5新标签在IE6/IE7/IE8上并不能识别,需要进行JavaScript处理.以下就介绍几种方式. 方式一:Coding JavaS ...

  2. GloVe词分布式表示

    GloVe 模型介绍 下面的内容主要来自https://blog.csdn.net/u014665013/article/details/79642083 GloVe的推导 GloVe是基于共现信息来 ...

  3. Struts2报错:No result defined for action xxx and result input

    case如下: 1. 后台程序要升级, 修改了一些功能,但是没有修改或者添加action的参数. 2. 数据库需要升级,执行了一些sql,修改过action的值. 3. 当修改某个已经存在的记录,然后 ...

  4. Jupyter Notebook与Jupyterhub的安装与配置

    Jupyter Notebook是一个很好用的交互环境,Jupyterhub则在此基础上实现了多用户的管理.最近配置这个环境的时候也遇到了一些坑,想想自己疯狂百度的过程,在此把自己的完整安装配置流程记 ...

  5. [密钥权限过大错误]ssh “permissions are too open” error

    I had a problem with my mac where I couldn't save any kind of file on the disk anymore. I had to reb ...

  6. Python3 的异常处理

    Python3 的异常处理,在官方文档的 tutorial 中有说明. 这里把常用的异常处理方法都列出来,方便平时查找. 捕获异常基类 Python3 要求我们的异常必须继承 Exception 类. ...

  7. 【bzoj4292】[PA2015]Równanie 暴力

    题目描述 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n<=b且k*f(n)=n的n的个数. 输入 第一行包含三个正整数k ...

  8. IOs动画的那些事儿

    CoreAnimation介绍 1:Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animatio ...

  9. idea部署项目到远程tomcat

    之前做项目,一直都是把本地的源码上传到svn,服务器是通过ant或者maven脚本来编译的生成项目的.每次都要单独登录接服务器进行项目的部署和发布,感觉特别繁琐.(特别是在有几套服务器的情况下,简直就 ...

  10. ZOJ 3772 Calculate the Function 线段树+矩阵

    Calculate the Function Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %ll ...