首页 > 其他分享 >【React工作记录八十八】React+antDesign封装一个tab组件(类组件)

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)

时间:2023-06-05 18:31:47浏览次数:42  
标签:const tab value React item key props 组件

前言

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

简单的父子组件

父组件

<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;

结果

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_不执行

需求介绍

需要做一个类似于这样的tab切换的组件

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_数据格式_02

备注:一个简单的区分方法是,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;

运行结果

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_数据格式_03

图解示意

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_微信公众号_04

变化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;

运行结果

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_微信公众号_05

图解

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_微信公众号_06

变化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;

运行结果

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_数据格式_07

图解

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_微信公众号_08

变化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
              onm ouseOver={() => this.setState({ mouseOverTable: item.key })}
              onm ouseLeave={() => 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;

运行结果

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_微信公众号_09

图解

【React工作记录八十八】React+antDesign封装一个tab组件(类组件)_微信公众号_10

总结

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

标签:const,tab,value,React,item,key,props,组件
From: https://blog.51cto.com/u_14476028/6418390

相关文章

  • 代码缩进 : Tab还是空格
    设置所有语言的缩进风格:Tools->Options->TextEditor->Alllanguage->Tabs设置某种语言的缩进风格:Tools->Options->TextEditor->C#->TabsIndentingNone:IDE不进行任何自动缩进Block:Smart:IDE在您编写代码时根据当前的编程语言风格自动缩进。建议永远......
  • 【IDE】WebStorm 调整Tab缩进为2空格 -- 为遵循ESLint语法规范
    在使用Vue开发项目的过程中,为了遵循ESLint语法规范,我们需要把Tab缩进改为2个空格IDEversionWebStorm2018.3步骤一修改这三处的值为:2步骤二把这两处默认的勾选去掉,不让其detection当前文件的Tab缩进注意!通过上面两个步骤,细心的同学会发现,我们只是改变了在JS文件的Tab缩进改为2个空格......
  • React 动态菜单-不限级递归菜单树
    import{FC,useState}from"react";import{Layout,Menu}from'antd';import{Link}from'react-router-dom'import{getData}from"../../mock-data";const{Header,Content,Footer,Sider}=Layout;//菜单数据结构type......
  • 视频直播源码,动态合并element-ui el-table列和行
    视频直播源码,动态合并element-uiel-table列和行HTML: <template>  <div>    <el-table     :data="tableData"     show-summary     :span-method="arraySpanMethod"    style="width:100%">      <......
  • visual studio 2010 c++ 创建com组件
    在VisualStudio2010中创建COM组件需要执行以下步骤:1. 打开VisualStudio2010,选择“新建项目”。2. 在弹出的对话框中选择“VisualC++”-->“Win32”-->“Win32项目”,并选择“DLL”作为应用程序类型。3. 单击“下一步”按钮。在下一个页面上,选择“ATL”,然后单击“完......
  • 系统化学习前端之Vue(vue2 组件通信)
    前言前文vue2基础中聊过,页面本质是DOM树,而在vue2中组件=vm实例对象=DOM。因此,页面其实也是组件树构成,组件之间形成父子关系,兄弟关系等,相互之间通信也是组件树的必须要求。vue2组件通信组件通信即组件之间的数据传递。props和$emit$attrs和$listener$parent......
  • 云原生第六周--k8s组件详解(下)
    一Velero结合minio实现kubernetesetcd数据备份与恢复Velero简介:Velero是vmware开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源数据Velero支持标准的K8S集群,既可以是私有云平台也可以是公有云,除了灾备......
  • Achieving a Better Stability-Plasticity Trade-off via Auxiliary Networks in Cont
    摘要连续学习过程中的稳定性-可塑性权衡是一个重要的问题。作者提出了AuxiliaryNetworkContinualLearning(ANCL),通过auxiliarynetwork提高了模型的可塑性。方法TheFormulationofAuxiliaryNetworkContinualLearning传统的continuallearning方法通常是在新数据集上......
  • Lattice-Based Group Signatures With Time-Bound Keys via Redactable Signatures
    ......
  • 1-4 列出fstab文件的详细信息
    切换到/etc/目录,列出fstab文件的详细信息,详细解决fstab一行,每个或每几个字符的详细含义。【cd/etc;ls-l/etc/fstab】[root@cent6~]#ls-l/etc/fstab-rw-r--r--.1rootroot899May2018:52/etc/fstab[root@cent6~]#1.权限-RW-R--R--;第一部分-RW代表所有......