antd tab右键菜单renderTabBar

-----2021年12月16日
我看还有问,这东西可以不从renderTabBar出发的,换个思路用css修改头部tab就好了,2019-11月补的就是这个思路,我补个codesandbox吧,get不到我就没办法了:
codesandbox

-----2019年11月05日
最近突然又想起来这个东西,可以用绝对定位解决:
首先把tabTitle块设为相对定位,close图标也设为绝对定位

.ant-tabs-bar .ant-tabs-tab{
   position: relative;
 }
.ant-tabs-bar .ant-tabs-tab > div > .ant-tabs-close-x{
   position: absolute;
   top: 14px;
   right: 16px;
}

可以看到,label是用来撑空间的,div相对于tabTitle绝对定位铺满了整个TabTitle,效果和最后一张图一致

 const tabTitles = (title)=>{
   return (
     <div style={{display:'inline-block'}}>
       <Dropdown overlay={menuItems(item)} trigger={['contextMenu']}>
         <div style={{display:'inline-block',position:'absolute',left:0,right:0,textAlign:'left',padding: '0 16px' }}>
           {title}
         </div>
       </Dropdown>
       <label style={{visibility:'hidden'}}>{title}<div style={{width:14,height:1,display:'inline-block'}} /></label>
     </div>
   );
 };
 
<TabPane tab={<span title={item.title} className={sty.tabTitle}>{tabTitles('Tab1')}</span>} closable>
  // 内容 
</TabPane>

-----2019年09月16日
发现这样改,当tab超出总宽度时,不能进行拖动,所以还是得固定tab使用,或者另加样式去适应了

-----2019年09月04日
最近在写tab的时候,要加上右键菜单,baidu和google似乎搜不到满意的结果。
然后在antd的issue找,有个例子:

const menu = (
  <Menu>
    <Menu.Item key="1">1st menu item</Menu.Item>
    <Menu.Item key="2">2nd menu item</Menu.Item>
    <Menu.Item key="3">3rd menu item</Menu.Item>
  </Menu>
);

const title = (
  <Dropdown overlay={menu} trigger={["contextMenu"]}>
    <span style={{ userSelect: "none" }}>Right Click on Me</span>
  </Dropdown>
);

ReactDOM.render(
  <Tabs defaultActiveKey="1" onChange={callback}>
    <TabPane tab={title} key="1">
      Content of Tab Pane 1
    </TabPane>
    <TabPane tab="Tab 2" key="2">
      Content of Tab Pane 2
    </TabPane>
    <TabPane tab="Tab 3" key="3">
      Content of Tab Pane 3
    </TabPane>
  </Tabs>,
  document.getElementById("container")
);

这种如果type='card’时,我们对tab头边缘地方进行右键点击时,是无效的,因为菜单只裹住了文字。

然后去提问了说用renderTabBar,在antd中的备注我们可以看到是: 替换 TabBar,用于二次封装标签头

我们在renderTabBar中提取key&title,样式拿antd(具体自调):

Css:

.activeTab {
  height: 40px;
  color: #1890ff !important;
  background: #fff !important;
  border-color: #e8e8e8 !important;
  border-bottom: 1px solid #fff !important;
}
.normalTab{
  height: 40px;
  margin: 0;
  margin-right: 2px;
  line-height: 38px;
  background: #fafafa;
  border: 1px solid #e8e8e8;
  border-radius: 4px 4px 0 0;
  -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
  transition: all .3s cubic-bezier(.645, .045, .355, 1);
  cursor: pointer;
}

Code:

class Demo extends React.Component{

  state ={
     activeKey: '1'
  };

  render(){
    const menuItems = (
      <Menu>
        <Menu.Item>
          <div>关闭当前标签页</div>
        </Menu.Item>
        <Menu.Item>
          <div>关闭其他标签页</div>
        </Menu.Item>
        <Menu.Item>
          <div >关闭全部标签页</div>
        </Menu.Item>
      </Menu>
  )
  const renderTabBar = (props, DefaultTabBar) => {
    // 提取tab信息
    const tabInfo = [];
    props.panels.forEach(item => {
      tabInfo.push({
        key: item.key,
        title: item.props.tab
      })
    });
    return (
      <Dropdown overlay={menuItems} trigger={['contextMenu']}>
        <div style={{display: 'flex',marginBottom:16}}>
          {
            tabInfo.map((item,index)=>(
	          <div>
	            key={item.key} 
	            onClick={()=>this.setState({activeKey:item.key})}
	            className={props.activeKey===item.key?'activeTab normalTab':'normalTab'}
	          >
	            <div style={{padding:'0 16px'}}>{item.title}</div>
	          </div>
           )
         }
        </div>
      </Dropdown>
    )
  };
  return (
    <Tabs activeKey={this.state.activeKey} renderTabBar={renderTabBar}>
      <TabPane tab="Tab 1" key="1" style={{ height: 200 }}>
        Content of Tab Pane 1
      </TabPane>
      <TabPane tab="Tab 2" key="2">
        Content of Tab Pane 2
      </TabPane>
      <TabPane tab="Tab 3" key="3">
        Content of Tab Pane 3
      </TabPane>
    </Tabs>
  )
}
    }

Result(边缘地方也可以点到了):
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要遍历antd Tab标签,可以使用antd Tab组件提供的属性和方法: 1. 使用Tab组件的onChange属性,当Tab标签被点击时,触发onChange事件,可以在事件处理函数中获取当前被点击的Tab标签的key值。 2. 使用Tab组件的activeKey属性,可以获取当前激活的Tab标签的key值。 3. 使用Tab组件的TabPane子组件,可以通过遍历TabPane子组件的props属性中的key值,来获取所有Tab标签的key值。 以下是示例代码: ```javascript import React, { useState } from 'react'; import { Tabs } from 'antd'; const { TabPane } = Tabs; const MyTabs = () => { const [activeKey, setActiveKey] = useState('1'); const handleTabClick = (key) => { console.log('Clicked tab:', key); setActiveKey(key); }; const tabKeys = ['1', '2', '3']; return ( <Tabs activeKey={activeKey} onChange={handleTabClick}> {tabKeys.map((key) => ( <TabPane tab={`Tab ${key}`} key={key}> Content of Tab Pane {key} </TabPane> ))} </Tabs> ); }; export default MyTabs; ``` 在这个示例中,我们使用了useState来定义activeKey状态,用于记录当前激活的Tab标签的key值。然后,我们在Tab组件中使用了onChange属性来监听Tab标签的点击事件,并在事件处理函数中更新activeKey状态。 我们还定义了一个tabKeys数组,它包含了所有Tab标签的key值。我们使用map方法遍历这个数组,创建了多个TabPane子组件,其中每个TabPane子组件中都包含了一个唯一的key值。这样,我们就可以通过遍历TabPane子组件的props属性,来获取所有Tab标签的key值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值