MUI v4升级至v5:如何将as属性传递给自定义组件及Emotion使用的Props列表查询
我刚帮不少开发者解决过MUI v4升v5的类似适配问题,针对你的两个疑问,给你详细拆解:
问题1:怎么把as属性传递给SomeOtherComponent
在MUI v5里,当你用component指定自定义组件时,as是Emotion(MUI默认样式引擎)用来控制MUI组件根元素类型的专属属性,它会被Emotion优先处理,不会自动透传给你传入的SomeOtherComponent。要让目标组件拿到as,有两种实用方案:
用匿名组件手动透传
把component的值换成一个匿名组件,把MUI组件的所有props连同as一起传递给SomeOtherComponent:<MuiComponent component={(muiProps) => ( <SomeOtherComponent {...muiProps} as="button" /> )} />这种方式自由度很高,你可以精准控制哪些props传给目标组件。
重命名为自定义属性传递
如果你不想用匿名组件,也可以把as换成自定义prop(比如rootAs),然后在SomeOtherComponent内部接收使用:// 父组件调用 <MuiComponent component={SomeOtherComponent} rootAs="button" /> // SomeOtherComponent内部实现 const SomeOtherComponent = ({ rootAs, ...rest }) => { const Root = rootAs || 'div'; return <Root {...rest} />; };
另外,如果你的SomeOtherComponent本身就是基于Emotion的styled组件构建的,那它原生就支持as prop,直接用就行,不用额外处理。
问题2:Emotion使用的Props列表在哪查
Emotion会处理的核心props(这些props不会直接透传给底层DOM)主要有三个:
css:用来传入Emotion的样式对象或字符串as:指定要渲染的HTML元素或自定义组件sx:这是MUI基于Emotion扩展的样式属性,虽然不属于原生Emotion,但在MUI v5里是高频使用的
如果你想查完整的列表,最权威的途径是看Emotion官方文档的@emotion/react板块;另外,在VS Code这类编辑器里,按住Ctrl点击你导入的Emotion组件(比如styled),就能直接查看它的TypeScript类型定义,里面会列出所有支持的props,非常直观。
除了上面提到的核心props,Emotion会把其他所有属性(包括原生HTML属性、你自定义的props)都原封不动地传递给底层渲染的元素或组件。
内容的提问来源于stack exchange,提问作者A.A

