【问题标题】:How does Material-UI Button component infer the props for the component passed to `component` prop?Material-UI Button 组件如何推断传递给 `component` prop 的组件的 props?
【发布时间】:2021-10-07 14:14:38
【问题描述】:

如果我在 component 属性中传递特定组件,谁能解释 Material-UI 如何使用我的组件的道具扩展其 Button 组件的道具?

interface MyLinkProps extends ButtonBaseProps {
  someRandomProp: string
}

const MyLink: React.FC<MyLinkProps> = () => {
  return <div></div>
}

<Button component={MyLink} someRandomProp="random">Something</Button>

在本例中,Button 组件现在知道属于我的组件的 someRandomProp 属性;正在传递给Button 组件上的component 属性。

我想达到同样的效果。我有一个 Image 组件,它有一个 prop component,我想推断正在传递的组件的 props。

例如,如果有类似的东西:

<MyImage component={NextImage} {...propsOfNextImage} />

基本上,我希望MyImage 自动检测和扩展NextImage 的道具。

【问题讨论】:

    标签: reactjs typescript material-ui next.js


    【解决方案1】:

    可以看到OverridableComponenthere的类型定义,这个负责将overridable component的props与组件原有的props合并。

    作为参考,请参阅它在 MUI 组件中的使用方式here。第一个泛型类型参数是具有以下属性的类型:

    • props:在与可覆盖组件的 props 合并之前,组件的原始 props。
    • defaultComponent:如果你不提供,默认的根组件。
    import { OverridableComponent } from '@mui/material/OverridableComponent';
    
    interface MyImageProps {
      src: string;
      myCustomProps?: string;
    }
    interface MyImageTypeMap {
      props: MyImageProps;
      defaultComponent: 'img';
    }
    
    const MyImage: OverridableComponent<MyImageTypeMap> = (props) => {
      const RootComponent = props.component || 'img';
      return (
        <RootComponent src={props.src} {...props}>
          {props.children}
        </RootComponent>
      );
    };
    

    用法

    {/* normal component with MyImageProps. The root component is an img element */}
    <MyImage src={src} />
    {/* component with MyImageProps & ButtonProps. The root component is a Button*/}
    <MyImage src={src} component={Button} variant="contained">
      I am actually a button in disguise
    </MyImage>
    

    现场演示

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2021-05-19
      • 2017-07-29
      • 2021-10-02
      • 2020-05-03
      • 2021-03-16
      • 2018-09-21
      • 2021-11-02
      • 2018-11-24
      相关资源
      最近更新 更多