@blocklet/ui-react
Version:
Some useful front-end web components that can be used in Blocklets.
165 lines (133 loc) • 7.38 kB
Markdown
# Footer
`Footer` 组件为你的应用提供了一个标准化的、响应式的页脚。它通过读取 blocklet 的元数据来自动填充其内容——包括品牌信息、导航链接、社交媒体图标和版权信息。这种数据驱动的方法确保了一致性并简化了配置。
该组件采用响应式设计,能够适应不同屏幕尺寸的布局。它还内置了逻辑,在应用以嵌入模式运行时自动隐藏,从而确保集成时用户界面的整洁。
## 基本用法
要为你的应用添加页脚,只需导入并渲染 `Footer` 组件即可。在基本使用中,它不需要任何 props,因为它会自动从全局 `window.blocklet` 对象中获取数据。
```jsx Usage Example icon=logos:react
import React from 'react';
import { Footer } from '@blocklet/ui-react';
export default function App() {
return (
<div style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
<main style={{ flex: 1 }}>
{/* 你的应用内容放在这里 */}
</main>
<Footer />
</div>
);
}
```
## Props
`Footer` 组件可以通过以下 props 进行自定义。
<x-field-group>
<x-field data-name="meta" data-type="object" data-required="false">
<x-field-desc markdown>
一个包含 blocklet 元数据的对象。使用此 prop 可覆盖默认的 `window.blocklet` 配置,或在全局对象不可用的环境中提供数据。其结构应与 blocklet 元数据格式匹配。
</x-field-desc>
</x-field>
<x-field data-name="theme" data-type="object" data-required="false">
<x-field-desc markdown>
一个用于自定义页脚外观的主题对象。该对象会与应用的默认主题进行深度合并,允许你覆盖颜色、字体和间距等特定样式。
</x-field-desc>
</x-field>
</x-field-group>
## 元数据配置
`Footer` 的内容主要通过 blocklet 的元数据文件(`blocklet.yml`)进行配置。该组件会读取此文件中的特定字段来渲染其不同部分。
以下是一个 `blocklet.yml` 配置示例,该配置填充了页脚的所有部分。
```yaml blocklet.yml
name: my-app
title: My App
description: A detailed description of my application that appears in the footer.
copyright: 'My Company Inc.'
# 导航链接按组进行结构化
navigation:
# 主页脚导航,支持两级分组
footer:
- title: 'Products'
items:
- title: 'Product A'
link: '/products/a'
- title: 'Product B'
link: '/products/b'
- title: 'Resources'
items:
- title: 'Documentation'
link: '/docs'
- title: 'Blog'
link: '/blog'
# 社交媒体链接
social:
- title: 'twitter' # 图标是根据标题推断的(例如 'twitter', 'github')
link: 'https://twitter.com/your-handle'
- title: 'github'
icon: 'mdi:github' # 你也可以指定一个 Iconify 图标名称
link: 'https://github.com/your-org'
# 底部链接,通常用于法律和隐私信息
bottom:
- title: 'Privacy Policy'
link: '/privacy'
- title: 'Terms of Service'
link: '/terms'
```
### 数据结构
元数据中的 `navigation` 对象定义了页脚中显示的链接。它被组织成三个不同的部分:`footer`、`social` 和 `bottom`。
<x-field-group>
<x-field data-name="navigation" data-type="object">
<x-field-desc markdown>
包含应用的所有导航结构。
</x-field-desc>
<x-field data-name="footer" data-type="array">
<x-field-desc markdown>
用于主页脚导航区域的链接组数组。支持两级层次结构。
</x-field-desc>
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="导航组的标题(例如,'Products')。"></x-field>
<x-field data-name="[].link" data-type="string" data-required="false" data-desc="分组标题本身的可选链接。"></x-field>
<x-field data-name="[].items" data-type="array" data-required="false" data-desc="子导航链接的数组。">
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="链接的显示文本。"></x-field>
<x-field data-name="[].link" data-type="string" data-required="true" data-desc="导航链接的 URL。"></x-field>
</x-field>
</x-field>
<x-field data-name="social" data-type="array">
<x-field-desc markdown>
指向社交媒体配置文件的链接数组。
</x-field-desc>
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="社交媒体平台的名称,用于推断图标(例如,'twitter')。"></x-field>
<x-field data-name="[].icon" data-type="string" data-required="false" data-desc="使用 Iconify 字符串(例如,`mdi:github`)明确指定一个图标。这将覆盖推断出的图标。"></x-field>
<x-field data-name="[].link" data-type="string" data-required="true" data-desc="社交媒体配置文件的 URL。"></x-field>
</x-field>
<x-field data-name="bottom" data-type="array">
<x-field-desc markdown>
显示在页脚最底部的链接数组,通常用于法律声明。
</x-field-desc>
<x-field data-name="[].title" data-type="string" data-required="true" data-desc="链接的显示文本(例如,'Privacy Policy')。"></x-field>
<x-field data-name="[].link" data-type="string" data-required="true" data-desc="链接的 URL。"></x-field>
</x-field>
</x-field>
</x-field-group>
## 布局
`Footer` 组件会根据提供的数据智能选择最合适的布局。这确保了在不同用例中都能实现清晰且功能正常的呈现。
- **标准布局**:当元数据中定义了 `footer` 导航链接或 `social` 社交媒体链接时,此布局会自动激活。它采用多区域设计,优雅地组织了品牌信息、社交图标和导航栏。在移动设备上,导航组会变为可折叠的手风琴式菜单,以提供更好的用户体验。
- **简洁布局**:如果没有提供 `footer` 或 `social` 链接,组件将回退到简化的单行布局。这对于只需要版权声明和一些基本链接(如“服务条款”或“隐私政策”)的应用来说非常理想。
## 主题化
你可以通过传递一个 `theme` 对象来自定义页脚的外观。该对象会与现有主题进行深度合并,从而实现有针对性的覆盖。
```jsx Custom Theme Example icon=logos:react
import { Footer } from '@blocklet/ui-react';
const customTheme = {
palette: {
background: {
default: '#2c3e50', // 页脚使用较暗的背景色
},
text: {
primary: '#ecf0f1',
secondary: '#bdc3c7',
},
divider: '#34495e',
},
};
// ... 在你组件的 render 方法中
<Footer theme={customTheme} bordered />;
```
## 嵌入模式下的行为
`Footer` 组件被一个高阶组件(`withHideWhenEmbed`)包裹,当应用在嵌入式上下文中渲染时,该组件会自动隐藏 `Footer`。此行为由一个会话存储键 `EMBED_MODE_KEY` 控制。如果此键设置为 `1`,页脚将不会被渲染。这在你的 blocklet 显示在另一个应用内部时,有助于防止出现多余的页脚。
---
有关 `Header` 组件的信息(该组件也通过 blocklet 元数据进行配置),请参阅 [Header 文档](./components-layout-header.md)。