
Refine Chakra UIRefreshButton详解重新获取当前记录数据及其源码级实现【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refineRefine 的 Chakra UI 集成包提供了RefreshButton组件它通过点击按钮重新拉取页面当前展示的记录数据是 Show/Detail 页面上最常见的“刷新”操作入口。本文以官方文档refresh.md为主线完整讲解其用法与全部属性并结合当前仓库源码深入剖析其底层调用链——包括useRefreshButton钩子如何定位 resource 与 id、loading状态如何从 React Query 查询状态推导以及点击后如何通过失效invalidate机制触发数据重新获取。它做了什么RefreshButton基于 Chakra UI 的Button组件渲染点击时触发 refine core 提供的useOne数据方法进而经由dataProvider重新请求指定 resource 下指定 id 的记录使页面上已缓存/已展示的数据与服务端最新状态保持一致。组件支持通过 refine CLI 执行 swizzleswizzle: true把源码复制到项目内做二次定制因此了解它的内部实现对你扩展其行为非常关键。基本用法在 Show 页面中把RefreshButton /放入Show的headerButtons插槽即可获得右上角的刷新按钮。以下示例注册了posts资源PostShow通过useShow取数headerButtons中放置刷新按钮完整可运行示例见原文档中的 live demo 代码块import { useShow } from pankod/refine-core; import { Show, Heading, Text, Spacer, MarkdownField, RefreshButton, } from pankod/refine-chakra-ui; const PostShow: React.FCIResourceComponentsProps () { const { queryResult } useShowIPost(); const { data, isLoading } queryResult; const record data?.data; return ( Show headerButtons{RefreshButton /} isLoading{isLoading} Heading ash5 sizesmId/Heading Text mt{2}{record?.id}/Text Heading ash5 sizesm mt{4}Title/Heading Text mt{2}{record?.title}/Text Heading ash5 sizesm mt{4}Content/Heading Spacer mt{2} / MarkdownField value{record?.content} / /Show ); };配合Refine组件的resources配置name: posts并挂上show: PostShow导航到/posts/show/123后点击按钮即会重新请求id为123的记录。属性详解recordItemId控制刷新哪条记录recordItemId决定刷新动作作用于哪条数据。不传时组件默认从路由中读取:idimport { RefreshButton } from pankod/refine-chakra-ui; const MyRefreshComponent () { return RefreshButton colorSchemeblack recordItemId123 /; };此时点击按钮会触发useOne获取 resource 为post取自路由、id 为123的记录。原文档明确提示RefreshButton默认从路由读取 id 信息因此显式传入recordItemId是覆盖这一默认行为的手段适合在列表页等无:id路由参数的位置刷新特定记录。resourceNameOrRouteName控制刷新哪个资源resourceNameOrRouteName决定刷新动作作用于哪个资源。同理不传时默认从路由解析资源名const MyRefreshComponent () { return ( RefreshButton colorSchemeblack resourceNameOrRouteNamecategories recordItemId2 / ); };此时点击按钮会获取 resource 为categories、id 为2的记录——即按钮所在的资源posts与要刷新的资源categories可以不同这在跨资源联动场景例如在文章详情页刷新关联分类中非常有用。hideText只显示图标hideText用于控制按钮文字是否展示。设为true时只渲染按钮图标const MyRefreshComponent () { return RefreshButton colorSchemeblack hideText recordItemId123 /; };从当前仓库的组件源码可以确认其实现方式hideText为true时渲染的是 Chakra UI 的IconButtonaria-label使用翻译后的 label否则渲染带leftIcon的Button见 refresh/index.tsx。其余 Chakra UI Button 属性由于RefreshButton的 props 类型是 Chakra UIButtonProps的超集colorScheme、size、isLoading、className等原生属性都会透传源码中通过{...rest}展开到Button/IconButton上文档示例中的colorSchemeblack即由此而来。此外 Chakra UI 版本还支持svgIconProps用于微调内部刷新图标默认使用tabler/icons-react的IconRefresh尺寸 20。API Reference属性一览属性类型默认值说明recordItemIdBaseKey从 URL 的:id读取指定要刷新数据的记录 idresourceNameOrRouteNamestring从路由推断的资源名指定要刷新的资源hideTextbooleanfalse为true时仅显示图标onClickPointerEventHandlerHTMLButtonElement—自定义点击处理函数提供后会替代默认刷新逻辑dataProviderNamestringdefault指定目标 data provider多 data provider 场景childrenReactNodei18n 的buttons.refresh默认Refresh按钮文字svgIconPropsOmitIconProps, ref—透传给刷新图标的 SVG 属性Chakra UI 专属扩展...restChakra UIButtonProps—透传给底层Button/IconButton说明recordItemId/resourceNameOrRouteName的默认行为与上表基于原文档v3 版本 API。在当前仓库源码中v4 起 props 命名演化为resource/recordItemId且meta已从类型中移除见下文实现章节。源码级实现剖析组件层packages/chakra-ui中的薄封装当前实现位于 RefreshButton 组件它本身不写任何取数逻辑而是把全部行为委托给 core 的useRefreshButton钩子仅负责 UI 呈现const { onClick: onRefresh, label, loading, } useRefreshButton({ resource: resourceNameFromProps, id: recordItemId, dataProviderName, });几个值得注意的实现细节双形态渲染hideText为真时走IconButton分支附aria-label{label}否则走Button分支并以leftIcon挂载刷新图标两个分支都把variant固定为outline。loading 直接驱动按钮isLoading{loading}让 Chakra UI 按钮自动显示 spinner无需业务侧手动管理。onClick 可被覆盖onClick ? onClick(e) : onRefresh()—— 一旦传入自定义onClick默认刷新逻辑即被完全取代这为“刷新前先做前置校验”等定制留了口子。可测试性两个分支都注入了data-testid{RefineButtonTestIds.RefreshButton}与className{RefineButtonClassNames.RefreshButton}来自refinedev/ui-types供 E2E 与 UI 测试稳定定位。其 props 类型在 types.ts 中定义为export type RefreshButtonProps RefineRefreshButtonProps ButtonProps, { svgIconProps?: OmitIconProps, ref } ;而RefineRefreshButtonProps的通用部分定义在 packages/ui-types/src/types/button.tsx由RefineButtonCommonProps含hideText、RefineButtonResourceProps含resource注释明确“默认从路由推断资源名”、RefineButtonSingleProps含recordItemId注释“默认从 URL 读取:id”、RefineButtonDataProps含dataProviderName与RefineButtonLinkingProps含onClick组合而成——这正是上文 API 表中各默认行为的类型层依据。逻辑层core 中的useRefreshButton真正的“刷新”逻辑集中在 packages/core/src/hooks/button/refresh-button/index.tsx三个返回值各有来源resource 与 id 的解析通过useResourceParams({ resource, id })把显式传入的 props 与路由参数合并路由值作为兜底默认——这就是“默认从路由读取 id / 资源名”的实现出处。label走国际化translate(buttons.refresh, Refresh)接入i18nProvider的应用会自动翻译按钮文字。loading从 React Query 状态推导const loading !!queryClient.isFetching({ queryKey: keys() .data(pickDataProvider(identifier, props.dataProviderName, resources)) .resource(identifier) .action(one) .get(), });即监听one查询是否处于 fetching 状态一旦取数开始按钮自动进入 loading取数结束自动恢复。点击后的动作是“失效”而非直接取数const onClick () { invalidates({ id, invalidates: [detail], dataProviderName: props.dataProviderName, resource: identifier, }); };点击调用useInvalidate使指定 resource/id 的detail类查询失效stale由 React Query 自动重新执行对应的one查询并回源到dataProvider。从源码结构看这与原文档描述的“点击触发useOne重新获取记录”在效果上等价但机制上已从“按钮直接调用useOne”演进为“失效查询、由缓存层驱动重新取数”——packages/ui-types 的 CHANGELOG 也记录了这次变更“RefreshButton /will useuseInvalidatesinstead ofuseOne”同时meta从RefineRefreshButtonProps中弃用。版本适用提示本文档主体对应 v3 版 APIresourceNameOrRouteName、useOne直取如果你基于当前仓库源码v4开发props 应写作resource刷新机制为 invalidatedetail查询。两者的默认行为从路由读 id 与资源名保持一致。测试保障Chakra UI 的按钮实现并非单独维护用例refresh/index.spec.tsx 直接绑定refinedev/ui-tests包的共享用例集import { buttonRefreshTests } from refinedev/ui-tests; describe(Refresh Button, () { buttonRefreshTests.bind(this)(RefreshButton); });这意味着 refresh 按钮在 Chakra UI、Mantine、Material UI 等各 UI 包中执行同一套行为契约渲染、点击触发刷新、hideText形态、onClick覆盖等保证了跨 UI 框架的行为一致性。core 侧同样有对应的 useRefreshButton 测试。小结与延伸阅读RefreshButton是 Refine “headless 逻辑 UI 薄封装”架构的典型样本UI 包packages/chakra-ui只负责按钮形态与事件接线资源/记录的定位、i18n 文案、loading 推导与失效刷新全部沉淀在 core 的useRefreshButtonpackages/core/src/hooks/button/refresh-button/index.tsx并通过refinedev/ui-types的共享类型与refinedev/ui-tests的共享用例在多 UI 包间保持一致。常用属性速查recordItemId123刷新指定 id 的记录默认取路由:idresourceNameOrRouteNamecategoriesv4 为resource刷新其他资源的记录默认取路由资源名hideText仅保留图标的紧凑形态透传全部 Chakra UIButton属性colorSchemeblack等样式写法直接可用。相关文档useOne、dataProvider、RefreshButton 原文档。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考