React组件中对子组件children进行加强

摘要:
而不是使用<{this.props.children}<element.type{…element.props}{…props}>{children}<'内联块“}}>”red'}}onClick={()=>console.log('hello')}>&书信电报;
React组件中对子组件children进行加强

问题

如何对组件的children进行加强,如:添加属性、绑定事件,而不是使用<div>{this.props.children}</div><div>上进行处理。

前车之鉴

今天写组件遇到这个问题,在网上查阅了很多资料,都说可以使用React.cloneElement进行处理,但是结果并不是预期想要的。

先看看这个东西有什么用:

React.cloneElement(element, [props], [...childrn])

根据React官网的说法,以上代码等价于:

<element.type {...element.props} {...props}>{children}</element.type>

这么做其实也是给children包了一层标签,再对其进行间接处理,没有直接修改children

如:

// App.jsx
<Father>
    <div style={{ color: 'red' }} onClick={() => console.log('hello')}>
        demo
    </div>
<Father>

我们希望在Father.jsx的内部将div转为inline-block。按照网上的做法,是这样的:

// Father.jsx
const Son = React.cloneElement(
    this.props.children,
    {
        style: {
            display: 'inline-block'
        }
    }
)

但是实际效果是这样的:

<div style={{ dispaly: 'inline-block' }}>
    <div style={{ color: 'red' }} onClick={() => console.log('hello')}>
        demo
    </div>
<div>

哈!?子元素的父元素被设为了inline-block,和我们想要的<div>demo</div>被设为inline-block。结果与预期完全不同,简直大失所望!!!

React.clone根本对不起它clone的名字!!!

自我探索

思路: jsx语法表示的元素只是react组件的一个语法糖。所以组件是对象。既然是对象我们就可以直接对其进行修改。

尝试在控制台打印一个如下react组件:

// this.props.children
console.log(
    <div
        style={{ color: 'red' }}
        onClick={() => {
            console.log('hello');
        }}
    >
        demo
    </div>
);

如下:

React组件中对子组件children进行加强第1张

所以直接修改this.props.children即可:

// Father.jsx
const { children } = this.props;
const Son = {
    ...children,
    props: {
  			...children.props,
        dispaly: {
            ...children.style,
            display: 'inline-block'
        },
        onTransitionEnd: () => { console.log('hello world') }
    }
}

总结

如何对组件的children进行直接加强,直接修改this.props.children对象即可。

免责声明:文章转载自《React组件中对子组件children进行加强》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇第15.36节 PyQt(Python+Qt)入门学习:containers容器类部件QFrame框架部件介绍【转】CentOS minimal 安装笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JSP介绍

1. 概况答:1) 以文本为基础能够返回动态内容到客户端;2) Http是请求和响应的默认协议;3) 一个页面可以混和html代码、Java代码以及JSP标答;4) 允许访问组件;2. JSP的好处答:1) 通过组件使用支持组件模型和软件重用;2) 源文件改变自动编译;3) 用户自定义标签简化页面开发;4) 能把Web内容, Java代码分开(针对Serv...

正则表达式——RegExp零宽断言

正则表达式之中,支持某匹配对象的前面或者后面满足条件的匹配模式。这种匹配模式叫做零宽断言。 零宽断言的格式类似于(?exp)exp (?<=ing)ing表示匹配对象前面是ing的,ing对象如:singingdancing能匹配第一个 kiss(?=ing)表示匹配对象后面是ing的,内容是kiss对象的如:kissingkissed只能匹配第一个...

SpringBoot+Redis集成简单测试

1、创建SpringBoot项目 准备:idea、redis   2、配置 2.1 maven依赖       <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr...

坑爹的微信支付v3,其实没有那么坑

    研究微信开发一年多了,每个新接口,都会第一时间进行研究。微信支付开放很久,一直没机会接触到支付接口,等了好久终于从朋友那儿搞到了接口,从此开始了我两天多的支付接口的研究。 拿到这个接口文档的第一个想法就是这也没什么难的嘛, 和支付宝、财付通、网银在线等一些传统接口的思路逻辑都是一样的,觉得差不多最多一个下午就可以搞定,结果第一步调用统一支付接口...

不错的TOMCAT监控好工具probe

Tomcat版本:6.0.41 Probe版本:2.3.3 一,Tomcat没有默认用户账号,故首先需要添加Tomcat用户账号 修改$CATALINA_HOME/conf/tomcat-users.xml: <tomcat-users> <!-- 用户角色 --> <role rolename="manager"/>...

用jq中jSignature做手动签名

<!DOCTYPE html><html lang="zh-CN"><head> <title>手写板签名demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <...