UNPKG

@blocklet/ui-react

Version:

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

165 lines (133 loc) 7.38 kB
# 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)。