react基础知识-6.组件复合

复合组件给你足够的敏捷去自定义组件的外观和行为,这种方式更明确和安全。如果组件中有公用的非ui逻辑,将他们抽取为js模块导入而不是继承它们

6.1不具名组件

import React,{Component} from "react";

export default class BottomBar extends Component{
  render(){
    return(
      <div className = "bottomBar">
        <h3>BottomBar</h3>
      </div>
    )
  }
}
import React,{Component} from "react";

export default class TopBar extends Component{
  render(){
    return(
      <div className = "topBar">
        <h3>TopBar</h3>
      </div>
    )
  }
}
import React,{Component, component} from "react";
import TopBar from '../components/TopBar'
import BottomBar from '../components/BottomBar'

export default class Layout extends Component{
  componentDidMount(){
    const {title="商城"} = this.props
    document.title = title
  }
  render(){
    const {children,showTopBar,showBottomBar} = this.props;
    console.log("children",children);
    return(
      <div>
        {showBottomBar&&<TopBar/>}
        {children.content}
        {children.txt}
        <button onClick = {children.btnClick}>button</button>
        {showBottomBar&&<BottomBar/>}
      </div>
    )
  }
}
import React,{Component, component} from "react"
import Layout from './Layout'

export default class UserPage extends Component{
  render(){
    return(
      <Layout showTopBar = {true} showBottomBar = {true} title="用户中心">
        <div>
          <h3>UserPage</h3>
        </div>
      </Layout>
    )
  }
}

6.2具名组件

import React,{Component, component} from "react"
import Layout from './Layout'

export default class UserPage extends Component{
  render(){
    return(
      <Layout showTopBar = {true} showBottomBar = {true} title="用户中心">
        {{
          content:(
            <div>
              <h3>HomePage</h3>
            </div>
          ),
          txt:"这是一个文本",
          btnClick:()=>{
            console.log("btnClick")
          }
        }}
      </Layout>
    )
  }
}

6.3复合组件

import React,{Component} from 'react'
function Card(props){
  return (
    <div xu = "card">
      {
        props.children
      }
    </div>
  )
}

function FormButton(props){
  return (
    <div className="Formbutton">
      <button onClick = {props.children.defaultBtns.searchClick}>默认查询</button>
      <button onClick = {props.children.defaultBtns.resetClick}>默认重置</button>
      {
        props.children.btns.map((item,index)=>{
          return (
            <button key={'btn'+index} onClick={item.onClick}>
              {item.title}
            </button>)
        })
      }
    </div>
  )
}

export default class CompositionPage extends Component{
  render(){
    return(
      <div>
        <Card>
          <p>我是内容</p>  
        </Card>
        CompositionPage
        <Card>
          <p>我是内容2</p>  
        </Card>
        <FormButton>
          {{
            defaultBtns:{
              searchClick:() => console.log("默认查询"),
              resetClick:() => console.log("默认重置")
            },
            btns:[
              {
                title:'查询',
                onClick:() => console.log('查询')
              },{
                title:'重置',
                onClick:() => console.log('重置')
              }
            ]
          }}
        </FormButton>  
      </div>
    )
  }
}

代码下载地址:https://gitee.com/JingYaBei/my-app.git

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值