reactjs React typescript 子组件

a64a0gku  于 2023-01-25  发布在  React
关注(0)|答案(2)|浏览(174)

我正在尝试使用以下样式的子组件创建一个React组件:https://react-bootstrap.github.io/components/cards/,它应该在左侧呈现一个组件,在右侧呈现一个组件

<MyComponent>
   <MyComponent.Left>
      foo
   </MyComponent.Left>
   <MyComponent.Right>
      bar
   </MyComponent.Right>
</MyComponent>

我的基本策略是创造这样的东西:

function MyComponent(props:PropsWithChildren):JSX.Element{
var leftComponent = ???;
var rightComponent = ???;
return 
(<div>
   <div className="this-goes-on-the-right">leftComponent</div>
   <div className="this-goes-on-the-left">rightComponent</div>
</div>);
}

function MyComponent.Left = function MyComponentLeft(props:PropsWithChildren){
   return (<div>props.children</div>);
}
function MyComponent.Right = function MyComponentRight(props:PropsWithChildren){
   return (<div>props.children</div>);
}

但是我不知道如何判断传递给MyComponent的子元素中哪个是MyComponent.Left,哪个是MyComponent.Right,我该如何在 typescript 中做到这一点呢?

zlhcx6iw

zlhcx6iw1#

他们正在使用Object.assign来分配“子组件”。

const Card: BsPrefixRefForwardingComponent<'div', CardProps> = React.forwardRef<
  HTMLElement,
  CardProps
>(
  (
    {
      props
    },
    ref,
  ) => {
    return (
      <Component
        ...
      </Component>
    );
  },
);

Card.displayName = 'Card';
Card.propTypes = propTypes;
Card.defaultProps = defaultProps;

export default Object.assign(Card, {
  Img: CardImg,
  Title: CardTitle,
  Subtitle: CardSubtitle,
  Body: CardBody,
  Link: CardLink,
  Text: CardText,
  Header: CardHeader,
  Footer: CardFooter,
  ImgOverlay: CardImgOverlay,
});

来源

wz8daaqr

wz8daaqr2#

1.可能有多种方法可以达到你的目标,最基本的方法是给组件设置一些名称,并检查每个子组件的名称(react docs),但我不推荐这样做。
1.相反,您应该正确地设置MyComponent.LeftMyComponent.Right的样式,以便无论它们传递给MyComponent的子级的顺序如何,都能以所需的方式显示它们。
大致说明我的意思:

function MyComponent(props:PropsWithChildren):JSX.Element{
  return (
    <div>{props.children}</div>
  );
}

function MyComponent.Left = function MyComponentLeft(props:PropsWithChildren){
   return (<div className="this-goes-on-the-left">props.children</div>);
}
function MyComponent.Right = function MyComponentRight(props:PropsWithChildren){
   return (<div className="this-goes-on-the-right">props.children</div>);
}

样式化嵌套组件的类的实现可以基于flex-box规则,或者浮动或者适合您的用例的任何规则。
1.还有一个选项与示例稍有不同,但可能有用,那就是将组件作为 prop 传递,而不是像下面这样的子对象:

function MyComponent(props:PropsWithChildren):JSX.Element{
  return (
    <div>
       <div className="this-goes-on-the-right">{props.right}</div>
       <div className="this-goes-on-the-left">{props.left}</div>
    </div>
  );
}

相关问题