ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Refine EditButton 使用指南:基于 shadcn/ui 的编辑按钮组件详解

Refine EditButton 使用指南:基于 shadcn/ui 的编辑按钮组件详解 Refine EditButton 使用指南基于 shadcn/ui 的编辑按钮组件详解【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine导读EditButton是 Refine 面向 shadcn/ui 生态提供的导航按钮组件之一它在底层复用 shadcn/ui 的Button组件并通过useNavigation的edit方法完成「带记录 ID 跳转到编辑页」的路由导航。本文基于 Refine 仓库中该组件的官方文档与源码实现完整讲解其安装方式、六种核心属性、API 参数表并深入源码揭示EditButton从点击到生成编辑路由 URL 的完整调用链帮助你直接在表格、详情页等场景中快速接入「编辑」操作。组件定位一句话跳转到编辑页EditButton的核心职责非常单一把应用重定向到指定资源的编辑页面并在路由中携带记录 ID。它在实现上做了两层组合参见 edit.tsxUI 层复用 shadcn/ui 的Button组件作为外观基础逻辑层调用 Refine 的useEditButtonhook内部即useNavigation的edit方法解析出目标路由to、按钮文案label以及访问控制状态。因此你不需要手动拼装路由字符串、不需要自己处理useNavigate只要声明「编辑哪个资源、哪条记录」剩余的路由填充由 Refine 完成。它通常出现在列表页表格的「操作列」、详情页头部操作区等位置。安装Refine 的 shadcn/ui 组件通过 shadcn CLI 以 registry 方式安装。执行npx shadcnlatest add https://ui.refine.dev/r/buttons.json该命令会一次性添加所有按钮组件包括EditButton以及同族的CreateButton、ShowButton、DeleteButton、CloneButton、ListButton、RefreshButton。这一点可以从注册表清单 buttons.json 中得到印证它声明了registryDependencies: [button, popover]并在files数组中包含了上述 7 个按钮的源文件。安装完成后组件会落到你的项目目录中例如src/components/refine-ui/buttons/edit.tsx导入路径为import { EditButton } from /components/refine-ui/buttons/edit;基础用法在表格操作列中编辑一行数据最典型的场景是在列表页的表格中为每一行渲染一个「编辑」按钮。以下示例把posts资源的记录渲染成表格每行末尾通过EditButton提供编辑入口import { EditButton } from /components/refine-ui/buttons/edit; import { Table, TableBody, TableCell, TableRow } from /components/ui/table; const PostList () { const posts [ { id: 1, title: First Post }, { id: 2, title: Second Post }, ]; return ( Table TableBody {posts.map((post) ( TableRow key{post.id} TableCell{post.title}/TableCell TableCell EditButton resourceposts recordItemId{post.id} / /TableCell /TableRow ))} /TableBody /Table ); };在这个示例中点击任意一行的按钮后应用会跳转到posts资源的edit动作对应路由并将post.id填充进路由的:id参数例如/posts/edit/1或/posts/1/edit取决于你定义的路由模式。属性详解recordItemId指定要编辑的记录 IDrecordItemId用于把记录 ID 追加到路由路径的末尾。默认情况下recordItemId会从当前路由参数中推断——也就是说如果当前路由本身已经携带了:id你甚至可以不传。import { EditButton } from /components/refine-ui/buttons/edit; const MyComponent () { return EditButton resourceposts recordItemId123 /; };点击按钮后Refine 会触发useNavigation的edit方法跳转到该资源的edit动作路径并把123作为必要参数填入路由。类型上它是BaseKeystring | number。resource指定目标资源resource用于把应用重定向到指定资源名的edit动作。默认情况下Refine 会从当前路由推断资源。当按钮所在上下文与目标资源不一致例如在跨资源的操作区中时显式传入import { EditButton } from /components/refine-ui/buttons/edit; const MyComponent () { return EditButton resourcecategories recordItemId123 /; };此时点击会跳转到categories资源的编辑页而非当前路由推断出的资源。源码层面navigation-button/index.tsx通过useResourceParams({ resource: props.resource, id: props.id })完成资源与 ID 的解析显式传入则优先使用否则从路由推断。meta补充或覆盖路由参数meta用于向edit方法传递额外参数。edit方法默认会沿用当前路由中已有的参数而你可以在meta中传入新参数或覆盖现有参数。典型场景是编辑路由包含资源之外的其他动态段。例如当edit动作路由被定义为/posts/:authorId/edit/:id这种包含两个动态段的模式时const MyComponent () { return EditButton meta{{ authorId: 10 }} /; };meta中的authorId会被用于填充:authorId段id则由recordItemId或路由推断提供。hideText仅显示图标hideText用于控制是否显示按钮文本。当为true时按钮只保留图标默认是 lucide-react 的Pencil图标。import { EditButton } from /components/refine-ui/buttons/edit; const MyComponent () { return EditButton recordItemId123 hideText{true} /; };适合在图标按钮密集的操作列中使用以节省横向空间。accessControl访问控制accessControl用于配置按钮的权限行为仅当应用为Refine/提供了accessControlProvider时才生效enabled是否启用访问控制检查hideIfUnauthorized当用户无权限时是否直接隐藏按钮而非仅置灰禁用。import { EditButton } from /components/refine-ui/buttons/edit; const MyComponent () { return ( EditButton accessControl{{ enabled: true, hideIfUnauthorized: true, }} / ); };默认值为{ enabled: true, hideIfUnauthorized: false }即默认开启检查但无权限时按钮是禁用状态而非隐藏。children自定义按钮内容children用于替换按钮的默认文本。默认文案是 Edit由 i18n 翻译键buttons.edit提供未配置翻译时 fallback 为 humanize 后的动作名。import { EditButton } from /components/refine-ui/buttons/edit; const MyComponent () { return EditButton recordItemId123Modify/EditButton; };传入children后默认的图标 文本组合会被完全替换为你提供的内容。源码剖析一次点击背后的完整调用链从组件到路由生成EditButton的底层链路清晰可查理解它能帮你更准确地预测按钮行为。第 1 层组件本身packages/refine-ui/registry/new-york/refine-ui/buttons/edit.tsxEditButton是一个React.forwardRef组件接收resource、recordItemId、accessControl、meta等 props调用useEditButton得到{ hidden, disabled, LinkComponent, to, label }hidden为true时直接return null不渲染按钮通过asChild包裹LinkComponent本质是渲染为一个带to的链接点击即导航若传入自定义onClick会先preventDefault阻止默认导航再执行你的逻辑禁用状态下点击会preventDefault阻止跳转。第 2 层useEditButton hookpackages/core/src/hooks/button/index.tsxexport const useEditButton (props) useNavigationButton({ ...props, action: edit });它是对通用useNavigationButton的封装把action固定为edit与useShowButton、useCloneButton等共享同一套导航按钮逻辑。第 3 层useNavigationButtonpackages/core/src/hooks/button/navigation-button/index.tsx通过useResourceParams解析id与resource显式 prop 优先否则从路由推断通过useButtonCanAccess计算canAccess、title、hidden、disabled完成访问控制核心是构建目标路由对edit动作而言需要同时有resource与id否则返回空字符串if (!id) return ; return navigation${props.action}Url;按钮文案label通过translate(buttons.edit, humanize(edit))获得因此支持多语言覆盖。第 4 层navigation 的 editUrlpackages/core/src/hooks/navigation/index.tseditUrl(resource, id, meta)是最终的 URL 生成器从当前资源定义中查找action edit对应的路由模式如/posts/edit/:id或/posts/:id/edit对id做encodeURIComponent编码后通过composeRoute与go把:id段及meta中的参数填充进路由若资源未定义edit路由返回空字符串按钮将无法跳转。在 navigation/index.spec.tsx 的测试中可以看到明确的验证当资源定义为{ name: posts, edit: /posts/edit/:id }时editUrl(resource, 1)的结果为/posts/edit/1。这解释了「recordItemId会被追加到路由末尾」这一文档描述的实现来源。API 参考EditButton的属性汇总如下PropertyTypeDefaultDescriptionrecordItemIdBaseKeystring 或 number从路由参数推断要编辑的记录 IDresourcestring从路由推断资源名称或标识符metaRecordstring, unknown-传递给edit方法的附加元数据hideTextbooleanfalse为true时仅显示图标accessControl{ enabled?: boolean; hideIfUnauthorized?: boolean }{ enabled: true, hideIfUnauthorized: false }配置访问控制行为childrenReactNode默认文本与图标按钮的自定义内容...restReact.ComponentPropstypeof Button-其余 props 透传给底层 shadcn/uiButton组件如variant、size、className、onClick此外EditButton还接受 shadcn/uiButton组件的全部 props这意味着你可以无缝使用variant、size等样式属性保持与项目内其他 shadcn/ui 按钮一致的外观体系。从源码可以看到组件最终就是把...rest原样透传给Button并合并disabled/hidden状态。与同族按钮的协同EditButton属于 Refine 为 shadcn/ui 提供的整套 CRUD 按钮族安装时通过同一个buttons.json注册表一次获得同族还包括CreateButton、ShowButton、DeleteButton、CloneButton、ListButton、RefreshButton。它们共享几乎相同的 props 结构与底层useNavigationButton逻辑区别仅在于action不同create/show/edit/clone/list而DeleteButton与RefreshButton则分别基于useDeleteButton带确认 Popover与useRefreshButton触发数据刷新实现。因此掌握了EditButton的属性与工作原理也就掌握了整个按钮族的使用范式声明资源与记录 ID剩下的路由、权限与禁用逻辑交给 Refine 统一处理。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表