react封装通用tab组件
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import _ from 'lodash'
import classNames from 'classnames'
import {
  CloseButton,
} from '@dby-h5-clients/pc-1vn-components'
import './index.less'
class NormalTab extends Component {
  static propTypes = {
    style: PropTypes.object,
    tagIcon: PropTypes.element,
    name: PropTypes.string,
    onClick: PropTypes.func,
    closable: PropTypes.bool,
    onClose: PropTypes.func,
    isActive: PropTypes.bool,
  }
  static defaultProps = {
    style: {},
    tagIcon: null,
    name: 'normal-tab',
    onClick: _.noop,
    closable: true,
    onClose: _.noop,
    isActive: false,
  }
  state = {
    tabInfoWrapWidth: 100,
  }
  componentDidMount() {
    const tabInfoWrapElem = this.normalTabWrapElemRef.current
    this.tabInfoWrapElem = tabInfoWrapElem
    this.resizeObserver = new ResizeObserver(_.throttle(() => {
      if (tabInfoWrapElem !== undefined) {
        this.setState({
          tabInfoWrapWidth: tabInfoWrapElem.clientWidth,
        })
      }
    }, 200))
    this.resizeObserver.observe(tabInfoWrapElem)
  }
  componentWillUnmount() {
    this.resizeObserver.unobserve(this.tabInfoWrapElem)
  }
  resizeObserver
  normalTabWrapElemRef = React.createRef()
  tabInfoWrapElem
  render() {
    const closeBtnStyle = {
      height: '20px',
      width: '20px',
      flex: 'none',
      margin: 8,
    }
    const tabInfoWrapStyle = {
      // 当显示区域足够大或当前标签被选中的时候显示完整关闭按钮
      flex: (this.state.tabInfoWrapWidth > 84 || this.props.isActive === true) ? 1 : 'none',
    }
    return (
      <span
        className={classNames({
          'normal-tab-component-wrap': true,
          selected: this.props.isActive === true,
        })}
        ref={this.normalTabWrapElemRef}
        style={this.props.style}
        title={this.props.name}
      >
        <span
          className="normal-tab-info-wrap"
          tabIndex={0}
          role="button"
          style={tabInfoWrapStyle}
          onClick={this.props.onClick}
        >
          {this.props.tagIcon}
          {this.props.name}
        </span>
        {
          this.props.closable === true && (
            <CloseButton
              style={closeBtnStyle}
              onClick={this.props.onClose}
            />
          )
        }
      </span>
    )
  }
}
export default NormalTab
.normal-tab-component-wrap {
  min-width: 36px;
  height: 100%;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
  border-radius: 4px;
  background-color: rgba(54, 65, 82, 0.1);;
  margin-right: 1px;
  overflow: hidden;
  &:last-child {
    margin-right: 0px;
  }
  &:hover {
    background-color: #fff;
  }
  &.selected {
    background-color: #fff;
    min-width: 64px;
    .normal-tab-info-wrap {
      flex:;
    }
  }
  .normal-tab-info-wrap {
    height: 100%;
    max-width: 180px;
    display: flex;
    flex-direction: row;
    justify-content: flex-start;
    align-items: center;
    flex: none;
    font-size: 12px;
    color: #616e80;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    cursor: pointer;
    outline: none;
  }
}
react封装通用tab组件的更多相关文章
- ReactJS实现的通用分页组件
		大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果 ... 
- 使用react context实现一个支持组件组合和嵌套的React Tab组件
		纵观react的tab组件中,即使是github上star数多的tab组件,实现原理都非常冗余. 例如Github上star数超四百星的react-tab,其在render的时候都会动态计算哪个tab ... 
- 基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中。
		react-amap 这是一个基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中. 文档实例预览: Github Web | Gitee Web 特性 ️ 自动加载高德地 ... 
- 如何基于 React 封装一个组件
		如何基于 React 封装一个组件 前言 很多小伙伴在第一次尝试封装组件时会和我一样碰到许多问题,比如人家的组件会有 color 属性,我们在使用组件时传入组件文档中说明的属性值如 primary , ... 
- react hooks 如何自定义组件(react函数组件的封装)
		前言 这里写一下如何封装可复用组件.首先技术栈 react hooks + props-type + jsx封装纯函数组件.类组件和typeScript在这不做讨论,大家别白跑一趟. 接下来会说一下封 ... 
- react实战系列 —— react 的第一个组件
		react 的第一个组件 写了 react 有一个半月,现在又有半个月没写了,感觉对其仍旧比较陌生. 本文分两部分,首先聊一下 react 的相关概念,然后不使用任何语法糖(包括 jsx)或可能隐藏底 ... 
- JGUI源码:Tab组件实现(9)
		程序界面效果如下 Tab组件由多个TabItem组成,超出部分隐藏,可以通过左右按钮滑动显示出来 1.封装 // 初始化内容 $(function () { J.JTab($(".jgui- ... 
- 继续封装个 Volley 组件
		本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 前面已经封装了很多常用.基础的组件了:base-module, 包括了: crash 处理 常用工具类 apk 升级处理 log 组 ... 
- [转]angular2封装material2对话框组件
		本文转自:https://www.jianshu.com/p/da9978e25566 1. 说明 angular-material2自身文档不详,控件不齐,使用上造成了很大的障碍.这里提供一个方案用 ... 
随机推荐
- ICEM-带死角弯管
			原视频下载地址:https://yunpan.cn/cqRiHaQiLi8I7 访问密码 b5c6 
- 在开发iOS程序时对日期处理的总结
			小贴士(Tips)-iOS 由于iOS的设备对应多国语言,用户也可以选择不同的日历模式.比如日本的和历,泰国日历等等. 用户也可以自行设定24小时制或者12小时制来显示时间.这些设置会直接影响应用程序 ... 
- SpringCloud学习整理
			参考文档 [1]: Spring Cloud Ribbon负载均衡 
- Struts框架----进度1
			一.Struts的理解 1.struts是一个按MVC模式设计的web层框架,其实它就是一个大的Servlet:ActionServlet,或者是ActionServlet的子类.在web.xml文件 ... 
- SpringBoot-自动装配对象及源码ImportSelector分析
			SpringBoot框架已经很流行了,笔者做项目也一直在用,使用久了,越来越觉得有必要理解SpringBoot框架中的一些原理了,目前的面试几乎都会用问到底层原理.我们在使用过程中基本上是搭建有一个框 ... 
- 在phpstorm中如何对比文件呢?
			有两种方法: 在phpstorm中左侧的资源管理器中,按住键盘上的CTRL键,然后鼠标右键,点击菜单中的"Compare Tow Files",就可以了,如下图 在phpstorm ... 
- kvm网卡配置
			https://blog.51cto.com/quliren/2046001 https://blog.51cto.com/quliren/2045555 https://blog.csdn.net/ ... 
- CDH 安装的博客地址记录
			1. 集群环境配置 https://www.cnblogs.com/yinzhengjie/articles/11019333.html 2. 二进制方法安装 https://www.cnblogs. ... 
- opencv常见示例
			1.批量转换灰度图并保存 #include <iostream> #include <opencv2/opencv.hpp> #include <string> u ... 
- using 关键字有两个主要用途
			转自:https://www.jianshu.com/p/5357dc4efcf8 using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型. (二) ... 
