UNPKG

@blocklet/ui-react

Version:

Some useful front-end web components that can be used in Blocklets.

183 lines (143 loc) 8.31 kB
# Header `Header` 组件为 Blocklet 应用提供了一个响应式且可定制的页眉。它通过直接从 blocklet 的配置(`blocklet.yml`)中读取元数据,自动填充导航链接、应用 logo 和用户会话控件。该组件旨在以最少的配置创建一个功能丰富且一致的页眉。 ## 概述 `Header` 组件是主要的导航和品牌元素。它构建于 `@arcblock/ux` 组件之上,包括 `ResponsiveHeader` 和 `NavMenu`,并与用于用户身份验证的 DID Connect 会话上下文无缝集成。 主要功能包括: - **自动配置**:从 `blocklet.yml` 中填充应用 logo、标题和导航链接。 - **响应式设计**:自动适应不同的屏幕尺寸,提供移动设备友好的导航菜单。 - **会话管理**:与 DID Connect 集成,以显示用户信息、个人资料菜单以及登录/登出按钮。 - **可定制的插件**:允许注入自定义组件或修改默认元素,如主题切换器和语言选择器。 - **组织切换**:如果 blocklet 启用了组织支持,则自动包含一个组织切换器。 - **域名警告**:当管理员和用户通过临时域名访问应用时,通知他们配置自定义域名以提高安全性。 ### 工作原理 下图说明了 `Header` 的数据流和组件构成。它从 `blocklet.yml` 文件中读取配置,进行处理,并渲染相应的 UI 元素,包括 logo、导航链接和用户会话控件。 <!-- DIAGRAM_IMAGE_START:architecture:16:9:1765962229 --> ![Header](assets/diagram/header-diagram-0.zh.jpg) <!-- DIAGRAM_IMAGE_END --> ## 基本用法 要使用 `Header`,请将其导入并放置在应用的布局中。它需要 blocklet 的元数据,该元数据通常通过 `window.blocklet` 全局可用。 ```javascript "App.js" icon=logos:javascript import Header from '@blocklet/ui-react/lib/Header'; function App() { // meta 对象通常来源于 window.blocklet const blockletMeta = window.blocklet || {}; return ( <div> <Header meta={blockletMeta} /> <main> {/* 你的应用内容 */} </main> </div> ); } export default App; ``` ## Props `Header` 组件接受多个 props 以进行自定义。 <x-field-group> <x-field data-name="meta" data-type="BlockletMetaProps" data-required="false"> <x-field-desc markdown="blocklet 的元数据对象,通常来自 `window.blocklet`。它包含组件用于渲染的信息,如 `name`、`logo` 和 `navigation`。"></x-field-desc> </x-field> <x-field data-name="addons" data-type="Function | React.ReactNode" data-required="false"> <x-field-desc markdown="要添加到页眉右侧的自定义元素。如果提供一个函数,它会接收内置插件作为参数,允许您修改、重新排序或补充它们。如果提供一个节点,它将替换所有内置插件。"></x-field-desc> </x-field> <x-field data-name="sessionManagerProps" data-type="SessionManagerProps" data-required="false" data-default='{ "showRole": true }'> <x-field-desc markdown="直接传递给底层 `SessionUser` 组件的 props,用于控制用户会话信息的显示,例如显示用户角色。"></x-field-desc> </x-field> <x-field data-name="homeLink" data-type="string | Function" data-required="false" data-default="publicPath"> <x-field-desc markdown="主页链接的 URL,通常通过点击 logo 或品牌名称触发。它默认为 blocklet 的公共路径(`/`)。也可以是一个返回 JSX 元素的函数。"></x-field-desc> </x-field> <x-field data-name="theme" data-type="object" data-required="false"> <x-field-desc markdown="一个 Material-UI 主题对象,用于与默认主题合并,从而实现对颜色、排版和其他样式的深度自定义。"></x-field-desc> </x-field> <x-field data-name="hideNavMenu" data-type="boolean" data-required="false" data-default="false"> <x-field-desc markdown="如果为 `true`,即使存在导航数据,从 `blocklet.yml` 生成的导航菜单也将被隐藏。"></x-field-desc> </x-field> <x-field data-name="bordered" data-type="boolean" data-required="false" data-default="false"> <x-field-desc markdown="如果为 `true`,将在页眉底部应用一条边框以进行视觉分隔。"></x-field-desc> </x-field> <x-field data-name="logo" data-type="React.ReactNode" data-required="false"> <x-field-desc markdown="一个自定义 logo 元素,用于覆盖来自 blocklet 元数据的 logo。"></x-field-desc> </x-field> <x-field data-name="brand" data-type="React.ReactNode" data-required="false"> <x-field-desc markdown="一个自定义品牌元素(例如,文本或图像),显示在 logo 旁边。"></x-field-desc> </x-field> <x-field data-name="showDomainWarningDialog" data-type="boolean" data-required="false" data-default="true"> <x-field-desc markdown="如果为 `false`,则不会显示关于临时域名的警告对话框。"></x-field-desc> </x-field> </x-field-group> ## 功能 ### 从元数据自动生成导航 `Header` 会根据 `blocklet.yml` 文件中的 `navigation` 数组自动生成其导航菜单。该组件解析此配置以创建主导航链接和嵌套的下拉菜单。 以下是 `blocklet.yml` 中 `navigation` 配置的示例: ```yaml "blocklet.yml" icon=mdi:code-braces navigation: - title: Features link: /features icon: 'mdi:star' - title: Docs link: /docs icon: 'mdi:book-open' - title: More items: - title: About Us link: /about description: Learn more about our mission. - title: Community link: https://community.example.com description: Join our community forum. ``` `parseNavigation` 工具程序会处理此结构,处理 `title` 和 `description` 的本地化,并根据当前 URL 路径确定活动链接。 ### 会话管理和插件 页眉的右侧包含“插件”,这是一组用于会话管理和应用设置的控件。默认情况下,这些插件包括: - **组织切换器**:如果 blocklet 启用了组织支持,则会出现。 - **通知中心**:如果 blocklet 包含通知页面,则会出现。 - **语言选择器**:如果配置了多种语言,则会出现。 - **主题模式切换器**:在亮色和暗色模式之间切换。 - **会话控件**:显示已登录用户的头像和一个包含个人资料、设置和登出链接的菜单。对于访客,它会显示一个“连接钱包”按钮。 #### 自定义插件 您可以使用 `addons` prop 来自定义这些插件。 **示例:追加一个自定义按钮** 向 `addons` prop 提供一个函数。此函数接收一个包含默认插件元素的数组,允许您添加自己的元素。 ```javascript "HeaderWithCustomAddon.js" icon=logos:javascript import Header from '@blocklet/ui-react/lib/Header'; import Button from '@mui/material/Button'; function HeaderWithCustomAddon() { return ( <Header meta={window.blocklet} addons={(builtInAddons) => ( <> {builtInAddons} <Button variant="contained" color="primary" sx={{ ml: 1 }}> Upgrade </Button> </> )} /> ); } ``` **示例:替换所有插件** 提供一个 React 节点或节点数组来完全替换默认插件。 ```javascript "HeaderWithReplacedAddons.js" icon=logos:javascript import Header from '@blocklet/ui-react/lib/Header'; import Button from '@mui/material/Button'; function HeaderWithReplacedAddons() { return ( <Header meta={window.blocklet} addons={[ <Button key="feedback" variant="outlined" sx={{ ml: 1 }}> Feedback </Button>, ]} /> ); } ``` ### 在嵌入模式下隐藏 `Header` 被 `withHideWhenEmbed` 高阶组件包裹。当应用在嵌入式上下文(例如,在 `sessionStorage` 包含 `EMBED_MODE_KEY: 1` 的 iframe 中)渲染时,它将自动隐藏。当您的 blocklet 集成到另一个应用中时,这对于提供更简洁的 UI 非常有用。 ## 总结 `Header` 组件是在 Blocklet 应用中建立一致品牌和导航的强大工具。通过利用 blocklet 元数据,它简化了开发过程,同时通过 props 提供了广泛的自定义选项。 有关相关的布局组件,请参阅 [Footer](./components-layout-footer.md) 的文档。