【小技巧】react复合组件

写页面的时候最常碰见header 、content 、 footer 这种布局 , 当然不局限于这种 只要页面多数都要用到的组件都可以。
如果不使用组件复合 封装成组件后挨个引入感觉还是差点意思

做个小demo

主组件:

import React, { Component } from 'react'
import Layout from './Layout'
export default class index extends Component {
    render() {
        return (
            <Layout bottom={true} top={true} title={"首页"}>
                <div>中间显示的文字</div>
            </Layout>
        )
    }
}

layout:

import React, { Component } from 'react'


const divStyle = {
    width: '100%',
    height: '100px',
    textAlign: 'center',
    lineHeight: '100px'
}
export default class Layout extends Component {
    componentDidMount() {
        document.title = this.props.title || "未设置"
    }
    render() {
        const { children, top, bottom } = this.props
        return (
            <>
                {top && <header style={divStyle}>header</header>}
                {children}
                {bottom && <footer style={divStyle}>footer</footer>}
            </>
        )
    }
}

这里涉及到props.children 组件通过<div></div>这种形式写 中间的内容会自动被props.children接收

这种写法还可以继续扩展

扩展demo

主组件

import React, { Component } from 'react'
import Layout from './Layout'
export default class index extends Component {
    render() {
        return (
            <Layout bottom={true} top={true} title={"首页"}>
                {{
                    content: <div>内容</div>,
                    btnClick: () => {console.log("click me!")}
                }}
                <div>中间显示的文字</div>
            </Layout>
        )
    }
}

layout

import React, { Component } from 'react'


const divStyle = {
    width: '100%',
    height: '100px',
    textAlign: 'center',
    lineHeight: '100px'
}
export default class Layout extends Component {
    componentDidMount() {
        document.title = this.props.title || "未设置"
    }
    render() {
        const { children, top, bottom } = this.props
        console.log(this.props)
        return (
            <>
                {top && <header style={divStyle}>header</header>}
                {children[0].content}
                <button onClick={children[0].btnClick}>click me!</button>
                {bottom && <footer style={divStyle}>footer</footer>}
            </>
        )
    }
}

这里的children的表现:
在这里插入图片描述

变成了一个数组 由于我没有挂载

中间显示的文字
这个dom 所以不会显示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值