此功能仍处于实验阶段。“Experimental”(实验性)意味着这是早期实现,可能会发生重大且破坏性的更改。
这些面板为其子项提供渐进式发现选项。例如通过块支持提供的控件。
开发指南
ToolsPanel 创建一个带有标题的容器,其中包括一个下拉菜单。该菜单是根据与 ToolsPanelItem 组件类型匹配的面板子项自动生成的。
每个菜单项允许开启或关闭相应子项的显示。触发控件的 onSelect 和 onDeselect 回调,从而对子项进行更精细的控制,例如当块支持控件被切换为关闭时重置块属性。
子控件是否最初显示取决于之前是否已设置值,或者子项是否通过 isShownByDefault 属性标记为默认显示。确定子项是否有值是通过子项的 props 中提供的 hasValue 函数完成的。
未包裹在 ToolsPanelItem 内的组件仍然会渲染,但它们不会出现在 ToolsPanel 菜单中,也不受其控制。这种机制的一个有益场景是在面板内显示介绍性或帮助文本。
ToolsPanel 布局
ToolsPanel 采用两列网格布局。默认情况下,面板内的 ToolsPanelItem 组件样式设置为跨越两列,因为这符合大多数用例。大多数非控制元素(如帮助文本)将作为相关控件的 ToolsPanelItem 的子项渲染,无需额外样式。
假设某个元素与多个控件相关(例如对比度检查器),或与面板本身相关(例如面板描述)。在这种情况下,它们将被渲染到面板中,而无需包裹 ToolsPanelItem。默认情况下,它们仅跨越单列。如果这不可取,这些元素可能需要进行小幅样式调整,例如 grid-column: 1 / -1;
下面的使用示例将说明一个非 ToolsPanelItem 的描述段落、应在单行中显示的控件以及跨越两列的其他控件。
用法
import styled from '@emotion/styled';
import {
BoxControl,
__experimentalToolsPanel as ToolsPanel,
__experimentalToolsPanelItem as ToolsPanelItem,
__experimentalUnitControl as UnitControl,
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
const PanelDescription = styled.div`
grid-column: span 2;
`;
const SingleColumnItem = styled( ToolsPanelItem )`
grid-column: span 1;
`;
export function DimensionPanel() {
const [ height, setHeight ] = useState();
const [ width, setWidth ] = useState();
const [ padding, setPadding ] = useState();
const [ margin, setMargin ] = useState();
const resetAll = () => {
setHeight( undefined );
setWidth( undefined );
setPadding( undefined );
setMargin( undefined );
};
return (
<ToolsPanel label={ __( 'Dimensions' ) } resetAll={ resetAll }>
<PanelDescription>
Select dimensions or spacing related settings from the menu for
additional controls.
</PanelDescription>
<SingleColumnItem
hasValue={ () => !! height }
label={ __( 'Height' ) }
onDeselect={ () => setHeight( undefined ) }
isShownByDefault
>
<UnitControl
__next40pxDefaultSize
label={ __( 'Height' ) }
onChange={ setHeight }
value={ height }
/>
</SingleColumnItem>
<SingleColumnItem
hasValue={ () => !! width }
label={ __( 'Width' ) }
onDeselect={ () => setWidth( undefined ) }
isShownByDefault
>
<UnitControl
__next40pxDefaultSize
label={ __( 'Width' ) }
onChange={ setWidth }
value={ width }
/>
</SingleColumnItem>
<ToolsPanelItem
hasValue={ () => !! padding }
label={ __( 'Padding' ) }
onDeselect={ () => setPadding( undefined ) }
>
<BoxControl
label={ __( 'Padding' ) }
onChange={ setPadding }
values={ padding }
allowReset={ false }
/>
</ToolsPanelItem>
<ToolsPanelItem
hasValue={ () => !! margin }
label={ __( 'Margin' ) }
onDeselect={ () => setMargin( undefined ) }
>
<BoxControl
label={ __( 'Margin' ) }
onChange={ setMargin }
values={ margin }
allowReset={ false }
/>
</ToolsPanelItem>
</ToolsPanel>
);
}
Props
hasInnerWrapper: boolean
标记此 ToolsPanel 中的项目将包含在一个内部包装器元素中,使面板能够相应地布局它们。
- 必需:否
- 默认值:
false
dropdownMenuProps: {}
用于配置面板的 DropdownMenu 的弹出层 props。
- 类型:
DropdownMenuProps - 必需:否
headingLevel: 1 | 2 | 3 | 4 | 5 | 6 | ‘1’ | ‘2’ | ‘3’ | ‘4’ | ‘5’ | ‘6’
面板标题的标题级别。
- 必需:否
- 默认值:
2
label: string
要在面板标题中显示的文本文字,并作为面板下拉菜单的 aria-label。
- 必需:是
panelId: string | null
如果设置了 panelId,它将通过 ToolsPanelContext 传递并用于限制面板项。当设置了 panelId 时,只有当 panelId 显式为 null 或项目的 panelId 完全匹配时,项目才能注册自己。
- 必需:否
resetAll: ( filters?: ResetAllFilter[] ) => void
当选择“重置所有”菜单选项时调用的函数。作为参数,它接收一个数组,其中包含所有有效注册的 ToolsPanelItems 的 resetAllFilter 回调。
- 必需:是
shouldRenderPlaceholderItems: boolean
告知 ToolsPanel 当其 ToolsPanelItem 子项被切换为关闭并隐藏时,应渲染占位符内容(而不是 null)。
请注意,占位符项目不会应用通常通过 className 属性应用于可见 ToolsPanelItem 的 className。
- 必需:否
- 默认值:
false