跳到内容
+

覆盖组件结构

了解如何覆盖 MUI Base 组件的默认 DOM 结构。

MUI Base 组件旨在适应最广泛的用例,但您有时可能需要更改组件结构在 DOM 中的渲染方式。

为了理解如何做到这一点,拥有组件的准确心智模型会有所帮助。

心智模型

组件的结构由填充该组件插槽的元素决定。插槽最常由 HTML 标签填充,但也可能由 React 组件填充。

所有组件都包含一个根插槽,用于定义它们在 DOM 树中的主要节点;更复杂的组件还包含额外的内部插槽,这些插槽以它们所代表的元素命名。

所有非实用程序 MUI Base 组件都接受 slots 属性,用于覆盖它们渲染的 HTML 结构。

此外,您可以使用 slotProps 将自定义属性传递给内部插槽

根插槽

根插槽代表组件的最外层元素。对于更简单的组件,根插槽通常由组件旨在替换的原生 HTML 元素填充。

例如,Button 的根插槽是一个 <button> 元素。此组件有一个根插槽;更复杂的组件可能具有额外的内部插槽。

内部插槽

复杂的组件由一个或多个内部插槽以及根插槽组成。这些插槽通常(但不一定)嵌套在根插槽内。

例如,Slider 由一个根 <span> 组成,该根 <span> 容纳多个内部插槽,这些插槽以它们所代表的元素命名:track、thumb、rail 等等。

slots 属性

使用 slots 属性替换组件插槽中的元素,包括根插槽。下面的示例展示了如何使用 <ol> 覆盖 Select 组件中的 listbox 插槽(默认为 <ul>

slotProps 属性

slotProps 属性是一个对象,其中包含组件内所有插槽的属性。您可以使用它来定义要传递给组件内部插槽的其他自定义属性。

例如,下面的代码片段展示了如何向 Badge 组件的 badge 插槽添加自定义 CSS 类

<Badge slotProps={{ badge: { className: 'my-badge' } }} />

放置在主组件上的所有其他属性也会传播到根插槽中(就像它们放置在 slotProps.root 中一样)。以下两个示例是等效的

<Badge id="badge1">
<Badge slotProps={{ root: { id: 'badge1' } }}>

最佳实践

在覆盖更复杂组件的插槽时,请注意您渲染的 DOM 结构。如果您偏离默认结构太远(例如,通过无意中将块级元素嵌套在内联元素内部),您很容易破坏语义化和可访问 HTML 的规则。