让开!!!谁也别拦着我封装React组件!

1简介

我是歌谣 放弃很容易 但是坚持一定很酷 喜欢我就一键三连哈

 2前言

在我们的工作生活中 每次学习一个框架我们就不免要封装组件 而具备封装一个完美组件的能力 我称之为"优秀"

 3准备工作

父组件

<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

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

 

 数据格式

  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 (<ulstyle={{display: 'flex',background: '#FFFFFF',paddingLeft: '32px',width: '100%',...styles,}}>{tabs.map((item, index) => {const marginStyle =index === 0? {marginLeft: 0,}: {};return (<listyle={{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 (<ulstyle={{display: 'flex',background: '#FFFFFF',paddingLeft: '32px',width: '100%',...styles,}}>{tabs.map((item, index) => {const marginStyle =index === 0? {marginLeft: 0,}: {};return (<lionClick={() => 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 (<ulstyle={{display: 'flex',background: '#FFFFFF',paddingLeft: '32px',width: '100%',...styles,}}>{tabs.map((item, index) => {const marginStyle =index === 0? {marginLeft: 0,}: {};return (<lionMouseOver={() => 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;

运行结果

图解

 

 则封装完成

我是歌谣 放弃很容易 但是坚持一定很酷 谢谢你的鼓励 微信公众号小歌谣 一起学习 谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI-UIButton、UILable、UITextField总结

UIButton按钮 第一、UIButton的定义 UIButton *button[[UIButton buttonWithType:(UIButtonType); 能够定义的button类型有以下6种&#xff0c; typedef enum { UIButtonTypeCustom 0, 自定义风格 UIButtonTypeRoundedRect, 圆角矩形 UIButtonTypeDetailDisclosure, 蓝色小…

JAVA中线程同步的方法

1、wait方法。 2、notify方法和notifyAll方法。3、synchronized关键字。

ffmpeg教程

From&#xff1a; http://blog.csdn.net/cffishappy/article/details/7352898 概要 电影文件有很多基本的组成部分。首先&#xff0c;文件本身被称为容器Container&#xff0c;容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着&#xff0c;你有一…

如何实现在一个网页中弹出多个不同的小窗口

【1、最基本的弹出窗口代码】 其实代码非常简单&#xff1a; 1 <script language"javascript"> 2 <!-- 3 window.open (page.html) 4 --> 5 </script> 因为着是一段javascript代码&#xff0c;所以它们应该放在<script language"jav…

实现Parcelable接口

2019独角兽企业重金招聘Python工程师标准>>> 1 官方例子 public class MyParcelable implements Parcelable {private int mData;public int describeContents() {return 0;}public void writeToParcel(Parcel out, int flags) {out.writeInt(mData);}public static…

在Linux下编写C程序,怎么检查程序是否有内存泄漏?

From: http://bbs.chinaunix.net/thread-908769-1-1.html 如题。 ------------------------------- 找到了! http://www.valgrind.org/ 同时附一个转自 http://blog.chinaunix.net/u/18381/showart.php?id162015 的示例: #include <stdlib.h> void f(void) { i…

【蓝桥杯】历届试题 错误票据

历届试题 错误票据 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的&#xff0c;但ID的开始数码是随机选定的。 因为工作人员疏忽&#xff0c;在…

apue源码编译

http://www.apuebook.com/ 可以下载源码src.tar.gz 修改配置文件 编辑源码解压生成的apue.2e文件夹下的Make.defines.linux 修改WKDIR/home/var/apue.2e为你的apue.2e目录&#xff0c;比如我的apue源码解压在/usr/local,那我就改为&#xff1a; WKDIR/usr/local/apue .2e 然后…

一个跨平台的 C++ 内存泄漏检测器

From&#xff1a;http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html 内存泄漏对于C/C程序员来说也可以算作是个永恒的话题了吧。在Windows下&#xff0c;MFC的一个很有用的功能就是能在程序运行结束时报告是否发生了内存泄漏。在Linux下&#xff0c;相对来说就没…

PAT 1039. 到底买不买(20)

题目链接&#xff1a;https://www.patest.cn/contests/pat-b-practise/1039 解题思路&#xff1a;自己刚开始想的是用两个字符串来做&#xff0c;搜别人题解的时候发现别人一种很好的解题思路&#xff0c;是用string做的&#xff0c;感觉做的很巧妙 具体的代码如下&#xff1a;…

ios UIPickerView 技巧集锦

重新实现 UIPickerView 参考资料: http://www.cocoachina.com/bbs/read.php?tid85374 http://www.cocoachina.com/iphonedev/toolthain/2011/1205/3663.html 设置循环滚动 设置 UIPickerView 的数据源数量为很大的规模, 取数据时对行数进行取模, 从而实现循环滚动的效果. 在每…

PHP-递归扫描目录和删除目录

(1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){// 打开目录$dh opendir($path);echo <ul>;// 循环读取目录while(($file readdir($dh)) ! false){// 先要过滤掉当前目录.和上一级目录..if($file . || $file ..) continue;// 为了能够显示…

std::map的insert和下标[]访问

From: http://www.cnblogs.com/kex1n/archive/2011/11/16/2251520.html 在map中插入元素 改变map中的条目非常简单&#xff0c;因为map类已经对[]操作符进行了重载 enumMap[1] "One"; enumMap[2] "Two"; ..... 这样非常直观&#xff0c;但存在一个性…

Delphi工具之TDUMP

TDUMP是一个命令行程序&#xff0c;它输出.exe或.dll&#xff08;以及其他文件类型&#xff09;文件的结构。 TDUMP位于Delphi安装目录下的Bin目录里&#xff0c;如下&#xff1a; 缺省时&#xff0c;TDUMP的输出显示到屏幕上&#xff1b; 用户可以将TDUMP的输出定向到一个文本…

《与mysql零距离接触》视屏学习笔记

1、数据表的增删改查操作(crud)&#xff1a; 对于表&#xff1a; 增&#xff1a;create table XXXX 删&#xff1a;drop table XXXX 改&#xff1a;alter table XXXX rename to XXXX 查&#xff1a;select * from XXXX 对于行&#xff1a; 增&#xff1a;insert into XXXX(…

[Linux C]重启设备(系统)

说白了其实很简单&#xff0c;看代码: [zcmc #17]$cat r.c#include <sys/reboot.h>int main( void ){puts("reboot now");reboot(RB_AUTOBOOT);return 0;}[zcmc #18]$makegcc -g -o r r.c [zcmc #19]$执行下"./r"&#xff0c;系统将会重启&#xff0…

网络监控如影随形

网络监控如影随形 作为网络管理人员要做好网络设备的流量监控&#xff0c;及时洞悉网络流量的变化&#xff0c;就能及时发现潜在的网络故障&#xff0c;及时定位故障部位&#xff0c;及时予以排除&#xff0c;从而做到防患于未然。可是网管人员经常会由于各种事情不再网管机旁边…

JAVA基础进阶day01

最近一段时间的自学重心是安卓底层。首先啃一下java。新年伊始&#xff0c;向着 知识的海洋急行军&#xff0c;世界人民团结万岁…. 笔记方式为代码加注释的方式: 一、最基础 public class Hello {public static void main(String args[]) {System.out.println("Hello,…

libevent的使用(socket)

From: http://blog.csdn.net/kaitiren/article/details/35253319 这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中&#xff0c;为了防止程序阻塞在socket I/O操作上造成程序性能的下降&#xff0c;需要使用异步编程&#xff0c;即程序…

消费者承担消费税真的吃亏了吗?

像小老鼠一样享受&#xff0c;才不管消费税呢其实&#xff0c;我本来对经济学不感兴趣。一次偶然的机会&#xff0c;我在朋友的寝室里看到了传说中经济学最经典的教材之一——曼昆&#xff08;Mankiw&#xff09;的《经济学原理》。好奇心驱使我随手翻开了一页&#xff0c;读了…