
UI组件前端设计系统【免费下载链接】arco-designA comprehensive React UI components library based on Arco Design项目地址https://gitcode.com/gh_mirrors/ar/arco-design点击查看免费下载本篇技术指南聚焦于 Arco Design React 组件库中Image组件的「渐进加载Progressive Loading」能力通过向loader属性传入一张更小、更轻量的占位图让它在原图尚未加载成功时先行显示从而在视觉上模拟出类似 CDN 渐进式 JPEG 的加载体验。读完本文你将掌握loader属性的完整用法布尔值 / 自定义 ReactNode、渐进加载的实现原理基于useImageStatus状态机与 overlay 渲染机制并能结合lazyload、loaderClassName等能力搭建一套可落地的图片加载体验方案。一、为什么需要渐进加载在真实业务中高清大图往往体积大、加载慢。如果页面直接展示一张空白区域或转圈图标用户的等待体验会比较生硬而「渐进加载」的思路是先让用户看到一张模糊但有轮廓的占位图原图加载完成后平滑替换为高清图。这在视觉上给用户一种“图片逐渐清晰”的观感也是目前主流图片站点与内容平台普遍采用的体验优化手段。Arco Design 的Image组件为这一需求提供了非常轻量的内置支持。正如组件演示文档 progressive-loader.md 所描述的大图可通过给loader传递一个小一些的图片让其在原图未被加载成功时显示以此来模拟渐进加载。也就是说你不需要引入任何第三方图片处理库或额外的状态管理仅通过loader一个属性就能完成“小图占位 → 大图替换”的渐进加载闭环。二、核心用法给loader传一张小图loader属性的完整类型定义见 interface.ts/** * zh 加载过渡效果为 true 显示默认加载效果 * en Load transition effect, set true to show the default loading effect */ loader?: boolean | ReactNode; /** * zh loader 的样式将覆盖默认过渡效果 * en The style of the loader, will override the default transition effect */ loaderClassName?: string | string[];loader{true}显示组件内置的默认加载效果居中旋转图标 “Loading” 文字loader{ReactNode/}完全自定义加载过渡内容——渐进加载方案使用的就是这一分支把一张小尺寸 / 低清晰度的图片作为 ReactNode 传入loaderClassName给 loader 容器追加自定义类名用于覆盖默认加载样式详见后文“加载状态”章节。2.1 官方示例代码以下代码完整取自 progressive-loader.md是渐进加载的标准实现import React from react; import { Image, Button } from arco-design/web-react; function App() { const [timestamp, setTimestamp] React.useState(); return ( div div Button typeprimary onClick{() { setTimestamp(Date.now()); }} style{{ marginBottom: 20 }} reload /Button /div Image width{200} src{//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp?timestamp${timestamp}} loader{ img width{200} src//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp style{{ filter: blur(5px), }} / } altlamp / /div ); } export default App;2.2 逐段拆解这个示例到底做了什么① 占位小图loader 内的imgloader{ img width{200} src//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp style{{ filter: blur(5px) }} / }这里的src是不带?timestamp参数的静态地址浏览器会优先命中缓存因此加载极快filter: blur(5px)对图片做 5px 高斯模糊让“小图”呈现为一张柔化的低清轮廓这正是渐进加载观感的关键——模糊能掩盖清晰度不足的问题尺寸同样设为width{200}与Image本体保持一致保证占位与最终图片视觉尺寸对齐避免加载完成后发生布局跳动。② 高清原图Image的srcsrc{//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp?timestamp${timestamp}}原图地址带?timestamp${timestamp}查询参数这是强制绕过浏览器缓存的常见手段每次timestamp变化浏览器都会当作一个新的 URL 重新发起请求。配合 reload 按钮就能反复演示“小图先出现 → 大图加载 → 替换为清晰图”的完整过程。③ reload 按钮Button typeprimary onClick{() { setTimestamp(Date.now()); }} reload /Button点击按钮触发setTimestamp(Date.now())src变化后组件重新进入加载流程——这在演示环境中等价于“重新拉取大图”。在实际业务中你不需要这个按钮占位逻辑完全由组件内部驱动。三、源码级原理渐进加载在 Arco 内部如何运转理解了 API 用法后我们深入 image.tsx 看看组件内部是如何让“loader 小图”在原图未加载成功时显示出来的。3.1 图片加载状态机useImageStatus组件通过自定义 Hook useImageStatus.ts 维护一张五态状态机type ImageStatusType beforeLoad | loading | error | loaded | lazyload;beforeLoad初始状态图片尚未开始加载loading已发起加载、尚未完成error加载失败loaded加载成功lazyload开启了懒加载且图片尚未进入视口。在 image.tsx 中组件以beforeLoad作为初始状态实例化该 Hook并在原生图片事件中驱动状态迁移function onImgLoaded(e) { loaded.current true; setStatus(loaded); // 加载成功 → loaded onLoad onLoad(e); } function onImgLoadError(e) { loaded.current true; setStatus(error); // 加载失败 → error onError onError(e); }3.2 overlay 覆盖层占位内容的渲染位置关键渲染逻辑位于 image.tsx{!isLoaded ( div className{${prefixCls}-overlay} {isError (error || defaultError)} {isLoading renderLoader()} /div )}解读只要isLoaded为假即图片未加载成功组件就会渲染一个名为arco-image-overlay的覆盖层覆盖层内部分支渲染加载失败时显示error自定义错误内容或内置的默认错误块加载中时显示renderLoader()的返回值——渐进加载的小图正是经由这一分支呈现的对应的样式定义在 image.lessoverlay 是绝对定位并铺满整个图片容器-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }3.3renderLoader小图何时显示、何时让位renderLoader 的实现揭示了 loader 的完整决策逻辑const renderLoader () { if (loader true) return defaultLoader; const loadElem: React.ReactNode loader || defaultLoader; // 懒加载展示占位。 if (lazyload || loader) { return loadElem; } return null; };loader true返回内置默认加载效果IconLoading旋转图标 “Loading” 文本定义见 image.tsxloader传入 ReactNode如示例中的模糊小图返回该 ReactNode既没传loader也没开lazyload返回null——这也是演示文档中强调的“默认情况下加载效果是不显示的”。与此同时样式层在图片处于before-load/loading/loading-error状态时会把真实的img隐藏image.less-before-load, -loading, -loading-error { .{image-prefix-cls}-img { visibility: hidden; } }两段逻辑配合的效果是原图加载期间原img不可见overlay 上的小图占位或默认 loader成为唯一可见内容一旦onLoad触发、状态切到loadedoverlay 与 loader 一并卸载高清原图平滑接管显示区域。渐进加载在视觉上的“由模糊到清晰”由此完成。3.4 状态相关的 className 挂载组件还会根据状态动态拼接根节点类名image.tsx例如arco-image-before-load、arco-image-loading、arco-image-loading-error、arco-image-with-preview等。这为你在调试时观察组件处于何种加载阶段提供了便利也可作为自定义样式的挂载点。四、loader 相关 API 与样式定制4.1 参数一览来自 README.zh-CN.md 与 interface.ts与“加载过渡”直接相关的参数如下参数名描述类型默认值loader加载过渡效果为true显示默认加载效果boolean \| ReactNode-loaderClassNameloader 的样式将覆盖默认过渡效果string \| string[]-onLoad图片加载完成时触发(ev: SyntheticEventHTMLImageElement) void-onError图片加载失败时触发(ev: SyntheticEventHTMLImageElement) void-lazyload开启懒加载基于 IntersectionObserver APIv2.47.0 起boolean \| IntersectionObserverInit-errorerror 状态下显示的内容ReactNode-组件级默认值image.tsxconst defaultProps: ImagePropsType { footerPosition: inner, preview: true, };4.2 默认 loader 与样式 token如果不传loader内置默认加载块的结构为div className{${prefixCls}-loader} div className{${prefixCls}-loader-spin} IconLoading / div className{${prefixCls}-loader-spin-text}Loading/div /div /div其视觉样式定义在 image.lessloader 容器铺满整个图片区域width/height: 100%、绝对定位背景色、旋转图标颜色、字号等均可通过设计令牌覆盖对应 token 见 token.less例如image-color-loader-bg: var(~{arco-cssvars-prefix}-color-neutral-1); image-size-loader-min-height: 100px; image-font-size-loader-spin: 32px;4.3 自定义加载样式loaderClassName当默认加载效果不满足需求时可以给loaderClassName传入自定义类名并书写自己的加载动画。演示文档 loader.md 展示了两种用法左侧loader{true}直接启用默认加载效果右侧loaderClassNameimage-demo-loader-animate配合自定义 CSS渐变色扫过动画.image-demo-loader-animate { background: linear-gradient( -60deg, var(--color-fill-2) 25%, var(--color-neutral-3) 40%, var(--color-fill-3) 55% ); background-size: 400% 100%; animation: image-demo-loader-circle 1.5s cubic-bezier(0.34, 0.69, 0.1, 1) infinite; }这为渐进加载的占位阶段提供了除“静态小图”之外的更多表现手段例如骨架屏动画。五、实战扩展渐进加载与懒加载、错误态的组合5.1 与lazyload结合进入视口才加载Image从 v2.47.0 起支持lazyloadinterface.ts基于 IntersectionObserver 实现图片进入视口后才真正发起加载。渐进加载可与它无缝叠加视口外的图片先不加载进入视口后先显示 loader 小图、再替换为高清大图。参考 lazyload.md 中的写法把loader换成骨架屏等占位内容即可同时获得“懒加载 占位 渐进呈现”三层体验Image width{380} height{150} src{src} altlamp lazyload{{ threshold: 0.5 }} loader{Skeleton image{{ style: imageSize }} text{false} animation /} /注意在image.tsx的renderLoader中lazyload || loader任一成立都会渲染占位内容image.tsx因此开懒加载而不传loader时视口外不会渲染多余占位节点避免页面重排。5.2 与错误态对比占位 vs 失败兜底loader负责“加载中”的占位而error负责“加载失败”的兜底展示。两者在 overlay 中按状态分支渲染image.tsx互不冲突。若未传error组件会展示内置错误块IconImageClose图标 alt文案见 image.tsx错误态示例见 error.md。六、测试验证加载状态切换的可靠依据仓库中的测试用例 index.test.tsx 验证了图片加载状态切换的正确性其中updateImg工具通过fireEvent[method]模拟原生load/error事件const updateImg (wrapper, method load) { if (wrapper.find(img)[0] fireEvent[method]) { fireEventmethod[0]); jest.runAllTimers(); } };关键断言render image with error src先触发error断言出现.arco-image-error节点随后更换src并触发load断言错误节点被移除——这正对应“原图加载成功后 overlay 与占位/错误内容卸载”的行为render basic instance correctly验证点击图片触发onClick与预览onVisibleChangeThe image common property behaves normally验证onLoad回调与原生属性透传正常。这些用例从侧面印证了渐进加载依赖的“加载中 → 已加载”状态迁移、以及 overlay 条件渲染均有组件级测试保障你可以放心在业务中使用。七、小结与实践建议Arco DesignImage的渐进加载能力可以用一句话概括在loader中放入一张轻量小图让组件内部的加载状态机替你把“占位 → 替换”的过渡自动完成。综合本文内容给出三点落地建议占位图要轻使用同图更小尺寸、更低码率的版本如 CDN 的 webp 缩略图并加blur()滤镜弱化清晰度差异这是“渐进”观感的核心尺寸要一致loader 内图片尺寸与Image的width/height对齐避免替换瞬间的布局抖动组件容器本身会把width/height透传给内部imgimage.tsx按场景组合长列表页可叠加lazyload延迟真实请求需要品牌化占位时可改用loaderClassName自定义动画或骨架屏同时记得为加载失败提供error兜底内容保证任何网络状况下都有合理的 UI 呈现。如果你想查看完整演示与相关实现可继续翻阅仓库中的 progressive-loader.md、loader.md、lazyload.md 三个演示文档以及 image.tsx、useImageStatus.ts、image.less 三份核心源码文件。赞分享UI组件前端设计系统【免费下载链接】arco-designA comprehensive React UI components library based on Arco Design项目地址https://gitcode.com/gh_mirrors/ar/arco-design点击查看免费下载相关推荐Ant Design Blazor Image 组件渐进加载用 Placeholder 实现大图模糊占位实战指南Ant Design Blazor Image 组件渐进加载用 Placeholder 实现大图模糊占位实战指南 导读 本文围绕 ant design blaUI组件前端ant-design-blazor Image 渐进加载实战用 Placeholder 参数为大图构建模糊占位过渡ant design blazor Image 渐进加载实战用 Placeholder 参数为大图构建模糊占位过渡 导读 大图直接铺进页面时用户会长时间面对前端UI组件设计系统SDWebImage高级用法渐进式图片加载实现方案SDWebImage高级用法渐进式图片加载实现方案 引言移动端图片加载的性能瓶颈与解决方案 你是否曾遇到过这样的场景用户在使用iOS应用时面对缓慢的网络移动开发图像处理上一篇5分钟快速构建现代化管理后台Vue-Pure-Admin完整解决方案指南下一篇5分钟实现Elasticsearch集群监控Prometheus Operator配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考