让开!!!谁也别拦着我封装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,一经查实,立即删除!

相关文章

ffmpeg教程

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

实现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…

一个跨平台的 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 的数据源数量为很大的规模, 取数据时对行数进行取模, 从而实现循环滚动的效果. 在每…

Delphi工具之TDUMP

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

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;读了…

cocos2dx libevent简介和使用

From: http://blog.csdn.net/kaitiren/article/details/35254577 libevent是一个基于事件触发的网络库&#xff0c;memcached底层也是使用libevent库&#xff0c;今天学习下。总体来说&#xff0c;libevent有下面一些特点和优势&#xff1a;* 统一数据源&#xff0c; 统一I/O事…

Linux查看主板的相关信息

一条命令就能知道主板的一些信息&#xff0c;具体的内容就无需解释了&#xff0c;诸如厂商啊什么的&#xff0c;英文词的借助Google吧&#xff0c;哈哈 转载于:https://blog.51cto.com/kumu1988/1086248

在mac上配置cocos2d-x开发环境

From: http://www.cnblogs.com/xiaodao/archive/2013/01/08/2850751.html 一、下载cocos2d-x最新安装包 在终端中cd到本地将要存放目录&#xff0c;执行git命令 git clone https://github.com/cocos2d/cocos2d-x.git 二、如果开发ios程序&#xff0c;需要配置xcode模板 下好…

ASP.NET笔记(三)

一、使用主题自定义网站&#xff08;App_Themes&#xff0c;<Page Theme/StyleSheetTheme..>&#xff0c;<page theme"">&#xff09; 创建主题并将其应用于页 在 Visual Web Developer 中&#xff0c;右击网站名&#xff0c;单击“添加 ASP.Net 文件夹”…

磁盘IO:缓存IO与直接IO

文件系统IO分为DirectIO和BufferIO,其中BufferIO也叫Normal IO。 1. 缓存IO 缓存I/O又被称作标准I/O&#xff0c;大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中&#xff0c;数据先从磁盘复制到内核空间的缓冲区&#xff0c;然后从内核空间缓冲区复制到应用程…

F#初学笔记08

惰性求值惰性求值也叫按需调用&#xff0c;是一个演算策略&#xff0c;延迟一个表达式的演算&#xff0c;直到需要用到演算值的时候再演算&#xff0c;同时也避免了重复演算。惰性求值的好处包括&#xff1a;避免不必要的计算&#xff0c;提升性能。可以构造以构造一个无限的数…

在Finder标题栏上显示完整路径

From: http://www.7do.net/resources-5411-1-1.html 打开终端&#xff0c;输入以下命令并回车&#xff1a; defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES 然后再把finder关了再打开&#xff0c;你会发现路径栏变成这个样子了&#xff1a; 其实呢&a…

Wamp5 配置PHP 图文详解(转)

Wamp5论坛配置图文版 知识扫盲&#xff1a; 1、WampSever指的是apache mySQL PHP三合一套装&#xff0c;第一字母W&#xff0c;是指用于windows系统&#xff0c;我用的是2.0f版。用于Linux系统的&#xff0c;是LampSever&#xff0c;第一字母是L。 下载地址http://jaist.dl.s…

9个小窍门让OS X中Finder用起来更顺手

From: http://digi.tech.qq.com/a/20130309/000051.htm 腾讯数码讯&#xff08;编译&#xff1a; 李斯特&#xff09;Finder是OS X系统上用户与文件系统打交道的主要途径之一&#xff0c;它的默认设置是能满足普通用户绝大多数日常需求的。但我们同样可以通过一些小配置来使它…

xcode-select: error: tool 'xcodebuild' requires Xcode错误解决方法

From: http://blog.csdn.net/jymn_chen/article/details/21613745 因为机子里有两个Xcode&#xff0c;所以分别重命名了&#xff0c;但是在运行一个MakeFile时却报了以下错误&#xff1a; [plain] view plaincopyxcodebuild -target "GHUnitIOS (Device)" -configu…

利用Bdrive打造个人私有云存储解决方案

Bdrive 一款私有云储存软件&#xff0c;可以自己方便的在 Mac/Windows 下架设服务器&#xff0c;并可以通过 PC、Mac、iOS、Android 跨平台使用。以下简单介绍一下利用Bdrive来完成个人私有云存储解决方案。 第一步&#xff0c;搭建Bdrive云存储服务器 先下载Bdrive服务器程序&…

MVC路由中routes.IgnoreRoute({resource}.axd/{*pathInfo}) 到底什么意思!

转自&#xff1a;http://blog.csdn.net/lvjin110/article/details/24638913 参考&#xff08;1&#xff09; http://www.cnblogs.com/flyfish2012/archive/2013/02/01/2889184.html 我们在开发MVC当中&#xff0c;经常在我们的全局类的路由设置&#xff0c;看到这样的代码&…