react实现的tab切换组件

我有点想要吐槽,因为用原生的js实现起来挺简单的一个小东西,改用react来写却花了我不少时间,也许react的写法只有在复杂的web应用中才能体现出它的优势吧!不过吐槽归吐槽,对react这种优雅的代码的写法我自己是很喜欢的啊!来简单的讲一下,希望能对react的初学者有一些帮助...

效果图:

组建的编写用了一些es6的语法,用webpack作为转译打包工具。

把核心代码贴上来下...

var React=require("react");
var ReactDOM=require("react-dom");
require("../css/style.css");

class TabsControl extends React.Component{

    constructor(){
        super();
        this.state={
            currentIndex : 0
        };
    }

    check_tittle_index(index){
        return index===this.state.currentIndex ? "Tab_tittle active" : "Tab_tittle";
    }

    check_item_index(index){
        return index===this.state.currentIndex ? "Tab_item show" : "Tab_item";
    }

    render(){
        let _this=this;
        return(
            <div>
                {/*动态生成Tab导航*/}
                <div className="Tab_tittle_wrap">
                    { React.Children.map( this.props.children , (element,index) => {
                        return(
                            /*箭头函数没有自己的this,这里的this继承自外围作用域,即组件本身*/
                            <div onClick={ () => { this.setState({currentIndex : index}) } } className={ this.check_tittle_index(index) }>{ element.props.name }</div>
                            );
                    }) }
                </div>
                {/*Tab内容区域*/}
                <div className="Tab_item_wrap">
                    {React.Children.map(this.props.children,(element,index)=>{
                        return(
                            <div className={ this.check_item_index(index) }>{ element }</div>
                            );
                    })}
                </div>
            </div>
            );
    }
}

class TabComponent extends React.Component{

    render(){
        return(
            <div className="container">
                <TabsControl>
                    <div name="first">
                        我是第一帧
                    </div>
                    <div name="second">
                        我是第二帧
                    </div>
                    <div name="third">
                        我是第三帧
                    </div>
                </TabsControl>
            </div>
            );
    }
}

ReactDOM.render(<TabComponent/>,document.getElementById("app"));

总体的思路是这样的:

在<TabComponent/>组件中</TabsControl>组件包含着主要内容区域=>任意数量的div,在</TabsControl>组件中通过this.props.children获取到这些div,并且动态生成相应数量的Tab_tittle,再对标题区和内容区设置合适的className,以控制标题区的颜色切换和内容区域的显示和隐藏,</TabsControl>中通过state设置index来记忆被点击的区域,并且每一个标题区域都有绑定一个click处理方法,每一次点击都会重新设置state的index值,组件会自动调用this.render方法重新渲染视图,上面说到的className的设置规则也是借由index值来实现的=>当标题区域或者内容区域其对应的索引值与state中的index相同的时候,给它们添加具有特殊的即动态标示的className。至于标题区域和内容区域它们所具有的索引值则是借助于this.props.children的React.Children.map()方法来添加的...

/*代码*/

* onClick={ () => { ,使用es6的箭头函数的话,在这里this就不再是onclick的触发对象了,而是指向了其所在的组件,因为箭头函数没有自己的this,这里的this继承自外围作用域,即组件本身。

* 像

                <TabsControl>
                    <div name="first">
                        我是第一帧
                    </div>
                    <div name="second">
                        我是第二帧
                    </div>
                    <div name="third">
                        我是第三帧
                    </div>
                </TabsControl>        

则在<TabsControl>组件中使用this.props.children可以获取到一个包含三个div的数组,如果在这里只包含一个div的话,获取到的则是一个对象,react提供了React.Children.map()这样的方法来实现方便的对获取到的数组进行操作。

/*总结*/

react很好,我很喜欢,写出来的代码也很好看,不会像原生的js代码那样看起来很松散,而且我想react也是大势所趋吧,所以追随着react继续走下去是不会错的吧!

时间: 2024-10-14 11:19:03

react实现的tab切换组件的相关文章

react简单的tab切换 (styled-components)

其实,在我们日常的编程当中,经常会碰到tab切换的模块,那么,实现他的方法也有很多中,下面是一款简单,容易理解的react tab切换方法. 通过设置state中的current 属性去控制tab 和 内容模块. this.state = { current: 0, cities:['香港','北京','上海','台北'], content:[{ number: '13866666666', email: '[email protected], time: 'test123', },{ numb

Flutter——TabBar组件(顶部Tab切换组件)

TabBar组件的常用属性: 属性 描述 tabs 显示的标签内容,一般使用 Tab 对象,也可以是其他的Widget  controller TabController 对象 isScrollable 是否可滚动 indicatorColor 指示器颜色 indicatorWeight 指示器高度 indicatorPadding 底部指示器的 Padding indicator 指示器 decoration,例如边框等 indicatorSize 指示器大小计算方式,TabBarIndica

tab切换组件nz-tab

<nz-card [nzBordered]="true" nzTitle="卡片标题"> <nz-card style="width: 100%;" nzTitle="Card title" [nzExtra]="extraTemplate"> <nz-card-tab> <nz-tabset nzSize="large" [(nzSelecte

react做tab切换的几种方式

最近搞一个pc端的活动,搞了一个多月,甚烦,因为相比于pc端,更喜欢移动端多一点.因为移动端又能搞我的react了. 今天主要总结一下react当中tab切换的几种方式,因为tab切换基本上都会用到.当然,你也可以在react当中用jquery或者zepto来实现,不过既然都用react了,能不能用jq,就尽量不用jq.不过不得不吐槽一下,在jquery很简单的东西,在react中稍微复杂化了一点. 目前我用到的tab切换只有两种方式,所以暂时总结这两种,以后有遇到其他的再总结. 第一种.只是子

vue + element-ui 制作tab切换(切换vue组件,踩坑总结)

本篇文章使用vue结合element-ui开发tab切换vue的不同组件,每一个tab切换的都是一个新的组件. 1.vue如何使用element-ui 上一篇文章已经分享了如何在vue中使用element-ui创建tab组件切换内容(需要了解的朋友点击链接查看) 2.创建相应文件. a.创建父组件 src/components/tabZujian.vue b.创建自组件(被切换的组件)src/tabComponents 文件夹 + + tabComponents(目录) ---- tabZuji

vue -vantUI tab切换时 list组件不触发load事件解决办法

最近由于公司项目需要,用vue写了几个简单的页面.用到了vantUI List 列表 瀑布流滚动加载,用于控制长列表的展示 当列表即将滚动到底部时,会触发事件并加载更多列表项. 看上去一切都很美好:但是tab进行切换的时候,list组件的load事件不会再次被触发!!!就是list组件做上拉加载只有在第一个tab会触发,切换后触底不会再次触发 解决办法: 初始化定义了list的加载状态 tab切换时:重新初始化一次就行了 这样就解决了tab切换list组件不能再次被触发的问题 原文地址:http

用angularjs做简单的tab切换

用angularjs做简单的tab切换: 页面部分 <div> <div id="tabs" ng-controller="TabsCtrl"> <ul> <li ng-repeat="tab in tabs" ng-class="{active:isActiveTab(tab.url)}" ng-click="onClickTab(tab)">{{tab.t

Android典型界面设计-访网易新闻实现双导航tab切换

一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客Android典型界面设计2(FragmentTabHost+Fragment实现底部tab切换)基础之上和Android典型界面设计1(ViewPage+Fragment实现区域顶部tab滑动切换)整合应用实现.查看两篇博客请点击:http://www.cnblogs.com/jerehedu/p

第54课 Qt 中的多页面切换组件

1. 多页面切换组件(QTabWidget) (1)能够在同一个窗口中自由切换不同页面的内容 (2)是一个容器类型的组件,同时提供友好的页面切换方式 2. QTabWidget的使用方式 (1)在应用程序中创建QTabWidget的对象 (2)将其他QWidget对象加入该对象中.但QTabWidget对象每次只能加入一个QWidget对象,同时将成生成一个新的页面. (3)将多个组件加入到同一个QTabWidget页面的解决方案 ①创建容器类型的组件对象 ②将多个子组件在容器对象中布局 ③将容