react tabs 生成

image.png

准备工作

安装 mobx
(2)events(npm i events -S) https://blog.csdn.net/qq_40924034/article/details/104814694

addTabs --组件A

import React from 'react'
import {Button} from "antd";
import {observer} from 'mobx-react'
import tabsStore from "../../store/TabsStore";  //引入状态管理文件 局部引入
import emitter from '../../util/event'   //引入 event 
@observer
class AddTabs extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            panes:tabsStore.getPane().panes, //初始 tabs
        };
    }
    add = () => {
        var key = JSON.stringify(parseInt(this.state.panes[parseInt(this.state.panes.length)-1].key)+1)  // key值是panes数组最后一项的key键的值加一
        tabsStore.addTabs('导航'+key,'/login'+key,key) // 使用 状态管理的方法
        emitter.emit('key', key)   //兄弟之间传值

    };
    render() {
        return (
            <div style={{ marginBottom: 16 }}>
                <Button onClick={this.add}>ADD</Button>
            </div>
        )
    }
}
export {AddTabs as default}

TabsT --组件B

import React from 'react';
import { Tabs } from 'antd';
import {observer} from 'mobx-react'
import tabsStore from "../../store/TabsStore";
import emitter from '../../util/event'

const { TabPane } = Tabs;

@observer
class TabsT extends React.Component {
    constructor(props) {
        super(props);
// 接收A组件传的值
        emitter.on('key', opt => {
             // 参数
            this.setState({
                activeKey: opt
            })
        }) 
//初始数据
        this.state = {
            panes:tabsStore.getPane().panes,
            activeKey: tabsStore.getKey().activeKey,
        };
    }

//点击对应的标签页的显示
    onChange =( activeKey) => {
        tabsStore.setActiveTabs(activeKey)
        this.setState({ activeKey });
    };
    // 叉掉标签页
    onEdit = (targetKey) => {
        this.remove(targetKey)
    };

//移除
    remove = (targetKey) => {
    //判断移除项是否是激活状态
        if (this.state.activeKey==targetKey){
            console.log(1)
            this.onChange(JSON.stringify(parseInt(targetKey)-1))
        }
        tabsStore.removeTabs(targetKey)
    };



    render() {
        return (
            <div>
                <Tabs
                    hideAdd
                    onChange={this.onChange}
                    activeKey={this.state.activeKey}
                    type="editable-card"
                    onEdit={this.onEdit}
                >
                    {this.state.panes.map(pane => (
                        <TabPane tab={pane.title} key={pane.key}>
                            {pane.content}
                        </TabPane>
                    ))}
                </Tabs>
            </div>
        )
    }
}

export {TabsT as default}

tabsStore

import { observable, action } from 'mobx'

class TabsStore {
    @observable  panes = [
        { title: 'Tab 1', content: 'Content of Tab Pane 1', key: '1' },
    ];//初始标签显示几个
    @observable  activeKey=this.panes[0].key//激活的

    @action
        getPane(){
        return {
            panes:this.panes,
        }
    }
    获取激活的key
    getKey(){
        return  {
            activeKey:this.activeKey
        }
    }

    // 添加标签
        addTabs(title,url,key){
            this.panes.push({ title: title, content: url, key: key });
            this.activeKey = key
        }

    // 点击标签页显示
        setActiveTabs(activeIndex){
            this.activeKey = activeIndex
        }
    // 移除标签
        removeTabs(targetKey){
        this.panes.forEach((pane, i) => {
            if (pane.key==targetKey){
                if (this.panes.length>1){
                    if (i==0){
                        this.panes.splice(i,1)
                    }else {
                        this.panes.splice(i,1)
                    }
                }
            }
        });
    }
}

const tabsStore = new TabsStore;

export default  tabsStore;

event

import { EventEmitter } from 'events'
export default new EventEmitter()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260