react Children 插槽组件 - 项目中遇到的问题

一直想解决react的插槽组件的,这次有机会接触解决这个问题了。
场景是这样的

有一个组件,我想放入两个按钮,但是两个按钮的位置是在组件里面的不同位置的。
我不想把按钮写入到组件里面去,那样方法调用很麻烦

function App() {
const clickOne = () => {
  alert("点击导出按钮");
};
const clickTwo = () => {
  alert("点击导入按钮");
};
  return (
    <div className="App">
      <Contain>
        <Tabs defaultActiveKey="1" onChange={onChange}>
          <TabPane tab="Tab 1" key="1">
            <Box>
             <Button onClick={clickOne}>导出数据</Button>
              <Button onClick={clickTwo}>导入数据</Button>
            </Box>
          </TabPane>
          <TabPane tab="Tab 2" key="2">
            <Box></Box>
          </TabPane>
        </Tabs>
      </Contain>
    </div>
  );
}

Children.count(children) 计算组件的个数

import { Children, useEffect } from "react";
function Contain({ children }) {
  useEffect(() => {
    console.log("Children.count(children)", Children.count(children));
  }, []);
  return (
    <>
      <div>这是容器组件</div>
      {/* {children} */}
      {Children.count(children) > 0 ? children : <div>我是假的组件</div>}
    </>
  );
}

export default Contain;

Children.toArray(children) 属性还是很好用的

import { Tabs } from "antd";
import { Fragment, Children } from "react";
const { TabPane } = Tabs;
function Box({ children, key }) {
  return (
    <Fragment>
      <div tab={`Tab ${key}`} key={key}>
        Content of Tab Pane 1{Children.toArray(children)[0]}
      </div>
      <div>Content of Tab Pane 2 {Children.toArray(children)[1]}</div>
    </Fragment>
  );
}

export default Box;

Children.map()

 <Fragment>
      <div tab={`Tab ${key}`} key={key}>
        Content of Tab Pane 1
        {Children.map(children, (child) => {
          return child;
        })}
      </div>
    </Fragment>

react Children 插槽组件 - 项目中遇到的问题_第1张图片
Children.map 和Children.forEach一样的效果,只是方法不同

  {
          Children.map(children, (child) => {
            return child;
          })[0]
        }
        {
          Children.map(children, (child) => {
            return child;
          })[1]
        }

你可能感兴趣的:(项目遇到的问题,学习过程,react.js,javascript,前端)