首页 > 其他分享 >#yyds干货盘点 React+antDesign封装一个tab组件(类组件)

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)

时间:2023-03-24 17:01:55浏览次数:33  
标签:yyds const 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;

结果

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)_微信公众号

需求介绍

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

#yyds干货盘点 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;

运行结果

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)_数据格式_03

图解示意

#yyds干货盘点 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;

运行结果

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)_不执行_05

图解

#yyds干货盘点 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;

运行结果

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)_不执行_07

图解

#yyds干货盘点 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;

运行结果

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)_不执行_09

图解

#yyds干货盘点 React+antDesign封装一个tab组件(类组件)_不执行_10

总结

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

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

相关文章

  • react性能问题
    react性能问题:避免在表格的赋值区域直接进行值的输入和转换,因为组件会一次渲染,这个方法将执行多次,造成大量重复和无用的计算,如下图:正确方法:可在接口调用成功后赋......
  • React Native学习笔记(二)————(RN)初始化项目
    一、创建ReactNative项目1.1、ReactNative有一个内置的命令行界面,你可以用它来生成一个新项目。您可以使用Node.js附带的访问它,而无需全局安装任何内容。让我们创建......
  • Vue3+vite项目中如何动态导入并创建多个全局组件
    背景实际开发项目中,有些时候我们需要通过全局注册多个自定义组件,但是每个组件都导入一次,将会导致代码很冗余。实现方案customComponents/index.jsconstfiles=impor......
  • 第六章.Hive组件安装配置
    第六章.Hive组件安装配置1.1.实验目的完成本实验,您应该能够:掌握Hive组件安装配置掌握Hive组件格式化和启动1.2.实验要求熟悉Hive组件安装配置了解Hive组......
  • vue3组件之间传值
    父组件向子组件传值1.简单的props方式//fater.vue<divclass="father"><children:carr="arr"/></div><scriptsetuplang="ts">importchildrenfrom'./......
  • #yyds干货盘点#一个延迟库恢复的案例
    在日常工作中可能会存在误删数据的情况,今天就简单介绍下如何利用延迟库进行数据库的快速恢复。1.环境准备建立一个测试的主从库,写入一些测试数据,非本文要点,过程略。2.设置延......
  • React的生命周期
    -----------------------------------React旧版的生命周期-----------------------------------------------------------初始化阶段:由ReactDOM.render()触发----------......
  • Spring Cloud Alibaba系列(三)微服务配置管理和服务管理组件Nacos高可用集群的搭建
    网络上Nacos的文章很多,大部分都只说到了怎么搭建单机版本,这里来说说Nacos的集群。Nacos是SpringCLoudALibaba重要组件,起了注册中心和配置中心作用。首先微服务中通过以......
  • react函数组件中,父组件调用子组件的方法
    使用ref来处理。父组件里面   子组件里面   ......
  • #yyds干货盘点# LeetCode面试题:插入区间
    1.简述:给你一个无重叠的,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1:输入:i......