JGuang

异常

ErrorBlock · Ant Design Mobile

交互预览
npm install antd-mobile@5.43.0

异常 ErrorBlock

使用场景插画表示页面异常。

安装

npm install antd-mobile@5.43.0

antd-mobile 是移动网页组件库,不是 React Native 或小程序组件。React 19 项目需在入口用 unstableSetRender 注册 createRoot,否则 Toast、Dialog 等命令式 API 无法渲染;深色模式通过 <html data-prefers-color-scheme="dark"> 切换。

示例来自 Ant Design Mobile 官方仓库(MIT),固定在 npm 5.43.0 对应的提交;示例中的 DemoBlock 等展示辅助组件由 JGuang 重写,不属于 antd-mobile 的 API。

使用场景插画表示页面异常。

何时使用

适用于六种异常场景的反馈提示。

ErrorBlock

示例

属性

属性说明类型默认值
description描述ReactNode-
fullPage是否为整页异常booleanfalse
image图片string | ReactElement-
status默认错误类型'default' | 'disconnected' | 'empty' | 'busy''default'
title标题ReactNode-

CSS 变量

属性说明默认值全局变量
--image-height图片的高度100px--adm-error-block-image-height
--image-height-full-page整页模式下的图片高度200px--adm-error-block-image-height-full-page
--image-width图片的宽度auto--adm-error-block-image-width
--image-width-full-page整页模式下的图片宽度auto--adm-error-block-image-width-full-page

createErrorBlock

ErrorBlock 组件用起来非常简单,但是它不可避免的带来了一个问题:由于我们不知道你会用到哪些 status,所以我们只能把四种状态下的图片资源都打包进来,这会带来一些包体积上的问题。

为了能够尽可能少的引入资源,我们提供了一个工具函数 createErrorBlock,你可以使用它来创建一个定制化的 ErrorBlock 组件,其中只包含你需要的素材。

它的类型定义是:

declare function createErrorBlock(imageRecord: ImageRecord): React.ComponentType

type ImageRecord = Partial<Record<ErrorBlockStatus, string | ReactNode>>
type ErrorBlockStatus = 'default' | 'disconnected' | 'empty' | 'busy'

例如:

示例

如果在你的应用中,ErrorBlock 只需要支持 default 这种状态,那么你可以这样创建一个只打包了 default 图片素材的轻量化的 ErrorBlock:

import {defaultImage} from 'antd-mobile/es/components/error-block/images'

const ErrorBlock = createErrorBlock({
  'default': defaultImage,
})

我们在 antd-mobile/es/components/error-block/images 中 export 了四种状态对应的图片,你可以直接使用它们:defaultImage disconnectedImage emptyImage busyImage。

甚至,你可以直接配置成在线 CDN 中的图片资源,这样就可以很大程度上降低打包体积:

const ErrorBlock = createErrorBlock({
  'empty': 'https://gw.alipayobjects.com/zos/bmw-prod/7a2970f8-9247-4196-b3b3-2d0218c18b59.svg',
})

最终效果是:

createErrorBlock 的作用不止于此,你还可以使用它配置自定义的图片预设,创建出一个定制版的 ErrorBlock。你可以把图片素材替换成符合你自己项目中视觉风格的,也可以像下面这样替换成极简风格的图标: