@blocklet/ui-react
Version:
Some useful front-end web components that can be used in Blocklets.
185 lines (146 loc) • 8.32 kB
Markdown
# Dashboard
`Dashboard` 组件为 blocklet 应用程序提供了一个预构建的响应式布局,通常用于管理界面或以用户为中心的视图。它通过解析 blocklet 的元数据,自动构建一个包含侧边栏、头部和主内容区域的标准仪表盘。该组件显著减少了构建常见应用程序结构的样板代码。
该布局由三个主要部分组成:一个用于导航的持久侧边栏,一个用于全局操作和用户信息的头部,以及一个渲染特定页面内容的主内容区域。
<!-- DIAGRAM_IMAGE_START:architecture:16:9:1765962229 -->

<!-- DIAGRAM_IMAGE_END -->
## 基本用法
要使用 `Dashboard` 组件,只需用它包裹页面内容即可。该组件将自动在您的内容周围渲染头部和侧边栏。
```javascript MyDashboard.jsx icon=logos:react
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
export default function MyDashboardPage() {
return (
<Dashboard>
<h1>欢迎来到 Dashboard</h1>
<p>这是您的主内容区域。</p>
</Dashboard>
);
}
```
传递给 `Dashboard` 组件的子元素将显示在主内容区域。
## 属性
`Dashboard` 组件接受以下属性以自定义其行为和外观。
<x-field-group>
<x-field data-name="children" data-type="React.ReactNode" data-required="true">
<x-field-desc markdown>要在仪表盘布局的主内容区域内渲染的内容。</x-field-desc>
</x-field>
<x-field data-name="meta" data-type="object" data-required="false">
<x-field-desc markdown>一个 blocklet 元数据对象。如果提供,它将与默认的 `window.blocklet` 元数据合并并覆盖后者。这对于测试或动态更改 blocklet 信息非常有用。</x-field-desc>
</x-field>
<x-field data-name="fallbackUrl" data-type="string" data-required="false" data-default="publicPath">
<x-field-desc markdown>如果当前已认证用户根据其角色无权访问任何导航链接,则重定向到此 URL。设置为 `null` 可禁用此自动重定向。</x-field-desc>
</x-field>
<x-field data-name="invalidPathFallback" data-type="function" data-required="false">
<x-field-desc markdown>当当前 URL 路径与任何可用的导航链接都不匹配时执行的回调函数。默认行为是重定向到第一个可用的链接。</x-field-desc>
</x-field>
<x-field data-name="headerAddons" data-type="React.ReactNode | function" data-required="false">
<x-field-desc markdown>允许自定义头部右侧的附加组件。如果提供一个节点,它将替换所有默认的附加组件。如果提供一个函数,它会接收默认附加组件数组作为参数,允许您添加、删除或重新排序它们。</x-field-desc>
</x-field>
<x-field data-name="sessionManagerProps" data-type="object" data-required="false">
<x-field-desc markdown>要直接传递给头部底层 `SessionUser` 组件的属性。这允许自定义用户会话菜单,例如 `showRole` 或定义自定义的 `onLogout` 处理程序。</x-field-desc>
</x-field>
<x-field data-name="links" data-type="array | function" data-required="false">
<x-field-desc markdown>允许以编程方式修改侧边栏导航链接。如果提供一个数组,其项目将附加到从元数据生成的链接后面。如果提供一个函数,它将接收元数据生成的链接作为参数,并应返回一个新的链接数组。</x-field-desc>
</x-field>
<x-field data-name="showDomainWarningDialog" data-type="boolean" data-required="false" data-default="true">
<x-field-desc markdown>如果为 `true`,当应用程序从不受信任的域访问时,将显示一个警告对话框。</x-field-desc>
</x-field>
</x-field-group>
## 工作原理
`Dashboard` 组件被设计为“配置驱动”,其结构和内容主要来源于 blocklet 的元数据文件(`blocklet.yml`)。
### 从元数据生成导航
侧边栏导航是根据 `blocklet.yml` 中的 `navigation` 数组自动生成的。该组件专门查找其 `section` 属性中包含 `dashboard` 的导航项。
以下是如何定义仪表盘导航的示例:
```yaml blocklet.yml icon=mdi:file-document
navigation:
- title: 'Home'
link: '/'
section: 'dashboard'
icon: 'mdi:home'
role: ['owner', 'admin', 'guest']
- title: 'Analytics'
link: '/analytics'
section: 'dashboard'
icon: 'mdi:chart-bar'
role: ['owner', 'admin']
- title: 'Settings'
link: '/settings'
section: 'dashboard'
icon: 'mdi:cog'
role: ['owner']
items:
- title: 'Profile'
link: '/settings/profile'
- title: 'Billing'
link: '/settings/billing'
```
### 基于角色的访问控制
`Dashboard` 组件对导航链接实施基于角色的访问控制(RBAC)。每个导航项可以有一个 `role` 属性,这是一个允许查看该链接的角色数组。
- 如果导航项没有 `role` 属性,则对所有人可见。
- 如果当前用户未认证,他们只能看到包含 `guest` 角色的项目。
- 如果当前用户已认证,组件会将其 `user.role` 与每个导航项的 `role` 数组进行比较。只有在匹配的情况下,该项目才会显示。
- 只有当父导航项至少有一个子项可见时,父导航项本身才可见。
使用上面的 `blocklet.yml` 示例:
- 具有 `guest` 角色的用户将只看到“Home”链接。
- 具有 `admin` 角色的用户将看到“Home”和“Analytics”。
- 具有 `owner` 角色的用户将看到所有链接,包括“Settings”下的嵌套链接“Profile”和“Billing”。
### 图标
导航项的 `icon` 属性应该是一个字符串,对应于 [Iconify](https://icon-sets.iconify.design/) 库中的图标名称(例如,`mdi:home`)。您也可以提供一个指向图像文件的完整 URL。
## 自定义
虽然 `Dashboard` 被设计为可以与元数据开箱即用,但它也提供了几个属性用于更高级的自定义。
### 自定义头部附加组件
您可以使用 `headerAddons` 属性修改默认的头部附加组件(例如,主题切换器、区域设置选择器、会话管理器)。通过传递一个函数,您可以添加新元素或重新排列现有元素。
```javascript CustomHeader.jsx icon=logos:react
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
import Button from '@mui/material/Button';
function MyCustomButton() {
return <Button color="inherit" onClick={() => alert('Help!')}>Help</Button>;
}
export default function CustomDashboard() {
return (
<Dashboard
headerAddons={(existingAddons) => {
const customAddon = <MyCustomButton key="custom-help" />;
// 将自定义按钮添加到其他附加组件之前
return [customAddon, ...existingAddons];
}}
>
<p>带有自定义头部按钮的 Dashboard。</p>
</Dashboard>
);
}
```
### 以编程方式添加链接
`links` 属性允许您通过代码动态添加或修改侧边栏导航链接。这对于依赖于应用程序状态的链接非常有用。
```javascript DynamicLinks.jsx icon=logos:react
import Dashboard from '@arcblock/blocklet-ui-react/lib/Dashboard';
import Icon from '@arcblock/ux/lib/Icon';
const useFeatureFlag = () => {
// 在实际应用中,这里会检查功能开关服务
return true;
};
export default function DynamicDashboard() {
const isBetaFeatureEnabled = useFeatureFlag();
return (
<Dashboard
links={(existingLinks) => {
if (isBetaFeatureEnabled) {
const betaLink = {
id: 'beta-feature',
title: 'Beta Feature',
url: '/beta',
icon: <Icon name="mdi:test-tube" />,
external: true, // 客户端路由所需
};
return [...existingLinks, betaLink];
}
return existingLinks;
}}
>
<p>此仪表盘可能包含动态链接。</p>
</Dashboard>
);
}
```
## 总结
`Dashboard` 组件是快速搭建应用程序布局的强大工具。通过利用 blocklet 元数据,它提供了一个结构化、具备角色感知能力的开箱即用的导航系统。有关更基础的布局组件,请参阅 [Header](./components-layout-header.md) 和 [Footer](./components-layout-footer.md) 的文档。