zoukankan      html  css  js  c++  java
  • [React] Compound Component (React.Children.map & React.cloneElement)

    Imaging you are building a Tabs component.

    If looks like:

    <Tabs>
        <TabList>
            <Tab> one </Tab>
            <Tab isDisabled> two </Tab>
            <Tab> three </Tab>    
        </TabList>
    
        <TabPanels>
            <TabPanel>
                content one
            </TabPanel>
            <TabPanel>
                content two
            <TabPanel>
            </TabPanel>
            <TabPanel>
                content three
            </TabPanel>
        </TabPanels>        
    </Tabs>

    You want to know which tab is clicked (actived). But you don't want this actived tab state be exported to our app, you want it been kept to Tabs component. 

    For example in Tabs component, there is a state called 'activedIndex':

    class Tab extends React.Component {
      state = {
        activedIndex: 0
      }
    
      render() {
    return (
        {this.props.children}
      );
    } }

    You want to pass down to TabList and TabPanels componet. And also TabList and TabPanels may receive different props depends on usecases.

    You can use 'React.Children.map' to map over each direct child of the componet (in our case is TabPanels and TabList). 

     React.Children.map(this.props.children, (child, index) => {

    To pass down the new props, we can use 'React.cloneElement', which need the old props if any, but merge with new props we pass in.

    return React.cloneElement(child, {
                activeIndex: this.state.activeIndex
              })

    Code:

    class Tab extends React.Component {
      state = {
        activedIndex: 0
      }
    
      render() {
        return (
          React.Children.map(this.props.children, (child, index) => {
            if (child.type === TabPanels) {
              return React.cloneElement(child, {
                activeIndex: this.state.activeIndex
              })
            } else if(child.type === TabList) {
              return React.cloneElement(child, {
                activeIndex: this.state.activeIndex,
                isActivate: index === this.state.activeIndex
              })
            } else {
              return child
            }
          })
        )
      }
    }
  • 相关阅读:
    17963 完美数
    17086 字典序的全排列
    17082 两个有序数序列中找第k小(优先做)
    11087 统计逆序对(优先做)
    8594 有重复元素的排列问题(优先做)
    11076 浮点数的分数表达(优先做)
    9715 相邻最大矩形面积
    剑指offer----替换空格
    [IIS][ASP.NET]“拒绝访问临时目录”的解决方法
    windows 2003端口80system进程占用的情况
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7662795.html
Copyright © 2011-2022 走看看