react封装选项卡切换组件

react的特点:

  • 1.声明式设计 −React采用声明范式,可以轻松描述应用。

  • 2.高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。

  • 3.灵活 −React可以与已知的库或框架很好地配合。

  • 4.JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。

  • 5.组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。

  • 6.单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。

 react与vue的差异:

    数据:

  vue:双向数据绑定和单向数据流。双向数据绑定:DOM元素绑定的data值,当发生改变后,vue的响应式机制会自动监听data的变化重新渲染。单向数据流:当父组件给子组件传递数据的时候,子组件只可以读取而不能修改数据。可以用watch监听数据的更改,再赋给父组件的变量。

  react:单向数据流。DOM元素依赖于state,但改变state不会改变渲染好的DOM,通过setState()才能重新渲染。父组件传值到子组件,如果顶级的props变了,会重新渲染所有的子组件。

虚拟DOM:

  vue:计算出虚拟DOM的差异,在渲染的过程中跟踪每个组件的依赖关系,不会重新渲染整个组件树

  react:当应用的状态改变时,重新渲染全部子组件,可以通过shouldComponentUpdate生命周期进行优化

模板和jsx:

  vue:具有单文件组件,可以把html、css、js写在一个vue文件里----MVVM框架

  react:依赖于jsx,在JavaScript中创建DOM----视图层框架

构建工具:

  vue:vue-cli

  react:create-react-app 项目名

 

废话就不多说了,直接看代码吧

 

import React from "react";
import {TabBar,TabContent,TabBarItem} from './styled';
import PropTypes from 'prop-types';
export default class Tab extends React.Component{

    state={
        current:this.props.initPage //初始默认下标
    }
    //切换事件
    onChange=(i)=>()=>{
        this.setState({
            current:i
        })
    }
    render() {
        const {current} = this.state;
        return(
            
{ this.props.tabs.map((item,i)=>( {item.title} )) }
{this.props.children}
) } } Tab.propTypes={ tabs:PropTypes.array, initPage:PropTypes.number }; Tab.defaultProps = { tabs:[ { id:1, title:"选项一" }, { id:2, title:"选项二" }, { id:3, title:"选项三" } ], initPage:0 }
import styled from 'styled-components'; //样式

export const TabBar = styled.div`
    width: 100%;
    height: 43px;
    z-index: 1;
    flex-shrink: 0;
    display: flex;
    position: relative;
    
    .underline {
        position: absolute;
        width: 33.3333%;
        left: 0;
        height: 0;
        bottom: 0;
        border-top: 2px solid #108ee9;
        transition: top .3s cubic-bezier(.35,0,.25,1),left .3s cubic-bezier(.35,0,.25,1),color .3s cubic-bezier(.35,0,.25,1),width .3s cubic-bezier(.35,0,.25,1);
        will-change: top,left,width,color;
        
    }
`;

export const TabBarItem = styled.div`
    width: 33.3333%; 
    font-size: 15px;
    height: 43.5px;
    line-height: 43.5px;
    border-bottom: 1px solid #ddd;
    padding: 8px 0;
    display: flex;
    justify-content: center;
    align-items: center;
    box-sizing: border-box;
    
    &.active {
      color: #108ee9;
    }
`;

export const TabContent = styled.div`
    transition: transform .3s cubic-bezier(.35,0,.25,1),left .3s cubic-bezier(.35,0,.25,1),top .3s cubic-bezier(.35,0,.25,1),-webkit-transform .3s cubic-bezier(.35,0,.25,1);
    will-change: transform,left,top;
    display: flex;
    flex: 1;
    height: 100%;
    div {
        flex-shrink: 0;
        width: 100%;
        overflow-y: auto;
    }
`;
import React from 'react';
import ReactDOM from 'react-dom';
import Tab from "./components/tab";


ReactDOM.render(

    
        
内容1
内容2
内容3
, document.getElementById('root') );

这里的样式没用使用node-sass,而是使用了一个第三方依赖 styled-components,这个插件的具体用法就直接去看文档吧。以上就封装好了这个选项卡切换组件了,这个组件巧妙之处就在于利用了样式来实现页面的滑动效果,没有去操作真实Dom。

react封装选项卡切换组件_第1张图片

 

你可能感兴趣的:(react封装选项卡切换组件)