React+antDesign封装一个tab组件(类组件)

前言

我是歌谣 放弃很容易 但是坚持一定很酷 喜欢我就一键三连哈 微信公众号关注前端小歌谣 在我们的工作生活中 每次学习一个框架我们就不免要封装组件 而具备封装一个完美组件的能力 我称之为"优秀"

简单的父子组件

父组件

<Geyao/>

子组件

import React, { Component } from 'react'; class GeYao extends React.Component { render() { console.log(this, 'this'); console.log(this.props, 'props'); console.log(this.state, 'state'); return <div>我是歌谣</div>; } } export default GeYao;

结果

在这里插入图片描述

需求介绍

需要做一个类似于这样的tab切换的组件 在这里插入图片描述

备注:一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。这时候 我们想着这样的数据格式必须给个数组 然后父组件绑定值

变化1

数据格式

const tabs = [ { key: '', value: '全部' }, { key: '1', value: '已审核' }, { key: '2', value: '未审核' }, ];

父组件

<GeYao tabs={tabs} />

子组件

``` import React, { Component } from 'react'; class GeYao extends React.Component { render() { const { tabs = [] } = this.props;

console.log(this, 'this');
console.log(this.props, 'props');
console.log(this.state, 'state');
return (
  <ul>
    {tabs.map((item, index) => {
      return <li key={item.key}>{item.name || item.value || ''}</li>;
    })}
  </ul>
);

} } export default GeYao; ```

运行结果

在这里插入图片描述

图解示意

在这里插入图片描述

变化2

样式处理的还是不够完美 接下来处理样式

变化1

数据格式

const tabs = [ { key: '', value: '全部' }, { key: '1', value: '已审核' }, { key: '2', value: '未审核' }, ];

父组件

<GeYao tabs={tabs} />

子组件

``` import React, { Component } from 'react'; class GeYao extends React.Component { render() { const { tabs = [], styles, itemStyles } = this.props;

console.log(this, 'this');
console.log(this.props, 'props');
console.log(this.state, 'state');
return (
  <ul
    style={{
      display: 'flex',
      background: '#FFFFFF',
      paddingLeft: '32px',
      width: '100%',
      ...styles,
    }}
  >
    {tabs.map((item, index) => {
      const marginStyle =
        index === 0
          ? {
              marginLeft: 0,
            }
          : {};
      return (
        <li
          style={{
            color: '#1890FF',
            borderBottom: '2px solid #1890FF',
            padding: '0px 1.5% 8px',
            cursor: 'pointer',
            whiteSpace: 'nowrap',
            ...itemStyles,
            ...marginStyle,
          }}
          key={item.key}
        >
          {item.name || item.value || ''}
        </li>
      );
    })}
  </ul>
);

} } export default GeYao; ```

运行结果

在这里插入图片描述

图解

在这里插入图片描述

变化3

数据格式

const tabs = [ { key: '', value: '全部' }, { key: '1', value: '已审核' }, { key: '2', value: '未审核' }, ];

父组件

<GeYao tabs={tabs} />

子组件

``` import React, { Component } from 'react'; class GeYao extends React.Component { constructor(props) { super(props); this.state = { selectTab: props.selectTab || '', }; } /** * 切换tab * @param {Boolean} doNot 是否不做任何事情,如果存在此值,不执行父组件切换方法,仅仅刷新样式 */ handleTabClick(key, doNot) { console.log(key, 'key'); this.setState({ selectTab: key, });

} render() { const { selectTab } = this.state; const { tabs = [], styles, itemStyles } = this.props;

return (
  <ul
    style={{
      display: 'flex',
      background: '#FFFFFF',
      paddingLeft: '32px',
      width: '100%',
      ...styles,
    }}
  >
    {tabs.map((item, index) => {
      const marginStyle =
        index === 0
          ? {
              marginLeft: 0,
            }
          : {};
      return (
        <li
          onClick={() => this.handleTabClick(item.key)}
          style={{
            color: item.key === selectTab ? '#1890FF' : '#000000A6',
            borderBottom: item.key === selectTab ? '2px solid #1890FF' : '',
            padding: '0px 1.5% 8px',
            cursor: 'pointer',
            whiteSpace: 'nowrap',
            ...itemStyles,
            ...marginStyle,
          }}
          key={item.key}
        >
          {item.name || item.value || ''}
        </li>
      );
    })}
  </ul>
);

} } export default GeYao; ```

运行结果

在这里插入图片描述

图解

在这里插入图片描述

变化4

数据格式

const tabs = [ { key: '', value: '全部' }, { key: '1', value: '已审核' }, { key: '2', value: '未审核' }, ];

父组件

<GeYao tabs={tabs} onTabSearch={this.handleTabChange} />

子组件

``` import React, { Component } from 'react'; class GeYao extends React.Component { constructor(props) { super(props); this.state = { selectTab: props.selectTab || '', mouseOverTable: '', }; } /** * 切换tab * @param {Boolean} doNot 是否不做任何事情,如果存在此值,不执行父组件切换方法,仅仅刷新样式 */ handleTabClick(key, doNot) { console.log(key, 'key'); this.setState({ selectTab: key, }); if (!doNot) { try { this.props.onTabSearch(key); } catch (error) {} } } render() { const { selectTab, mouseOverTable } = this.state; const { tabs = [], styles, itemStyles } = this.props;

return (
  <ul
    style={{
      display: 'flex',
      background: '#FFFFFF',
      paddingLeft: '32px',
      width: '100%',
      ...styles,
    }}
  >
    {tabs.map((item, index) => {
      const marginStyle =
        index === 0
          ? {
              marginLeft: 0,
            }
          : {};
      return (
        <li
          onMouseOver={() => this.setState({ mouseOverTable: item.key })}
          onMouseLeave={() => this.setState({ mouseOverTable: 'mouseLeave' })}
          onClick={() => this.handleTabClick(item.key)}
          style={{
            color:
              item.key === selectTab || item.key === mouseOverTable ? '#1890FF' : '#000000A6',
            borderBottom: item.key === selectTab ? '2px solid #1890FF' : '',
            padding: '0px 1.5% 8px',
            cursor: 'pointer',
            whiteSpace: 'nowrap',
            ...itemStyles,
            ...marginStyle,
          }}
          key={item.key}
        >
          {item.name || item.value || ''}
        </li>
      );
    })}
  </ul>
);

} } export default GeYao; ```

运行结果

在这里插入图片描述

图解

在这里插入图片描述

总结

我是歌谣 放弃很容易 但是坚持一定很酷 谢谢你的鼓励 微信公众号前端小歌谣 加入前端巅峰交流群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值