Filament Link 组件实战指南:用 `<x-filament::link>` 构建可交互的链接与按钮
2026/9/10 15:15:04 网站建设 项目流程

Filament Link 组件实战指南:用<x-filament::link>构建可交互的链接与按钮

【免费下载链接】filamentA powerful open-source UI framework for Laravel • Build and ship apps & admin panels fast with Livewire项目地址: https://gitcode.com/GitHub_Trending/fi/filament

Filament(v4)内置的 Link Blade 组件用于渲染一个可点击、可执行动作的链接元素,是搭建管理后台界面时最常用的基础组件之一。本文以官方文档 docs/12-components/03-link.md 为主线,结合 support 包源码深入讲解tagsizeweightcoloricontooltipbadge等全部属性的用法与底层实现,读完即可在 Filament Panel、自定义页面或 Blade 视图中熟练使用。

基础用法:渲染一个链接

Link 组件通过 Blade 组件标签<x-filament::link>使用,最基本的写法是传入href属性并在标签体内写入链接文字:

<x-filament::link :href="route('users.create')"> New user </x-filament::link>

渲染出的 HTML 默认是<a>标签,并携带 Filament 的样式类fi-link(参见 packages/support/resources/css/components/link.css),其颜色默认使用主题色(primary)。

组件的所有可配置属性都定义在视图文件 packages/support/resources/views/components/link.blade.php 的@props中,包括badgebadgeColorbadgeSizecolordisabledformformIdhreficoniconAliasiconPositioniconSizekeyBindingslabelSrOnlyloadingIndicatorsizespaModetagtargettooltiptypeweight等。下文逐一讲解常用属性。

把链接变成按钮:tag 属性

默认情况下 Link 组件渲染为<a>标签。当你想用链接的外观去触发一个前端交互(比如 Livewire 事件)而不是页面跳转时,可以通过tag="button"把底层标签切换为<button>

<x-filament::link wire:click="openNewUserModal" tag="button" > New user </x-filament::link>

从 link.blade.php 的渲染逻辑可以看出:

  • tag="button"时组件会把wire:click等事件属性直接透传到<button>上,并自动附加type="button"
  • 同时会挂上wire:loading.attr="disabled",即请求进行中时自动禁用按钮,防止重复提交;
  • tag="a",则通过generate_href_html($href, $target === '_blank', $spaMode)生成href,并支持target="_blank"与 SPA 模式下的软导航处理。

tag属性还支持form值:此时组件会额外包裹一层<form>,内部渲染为提交按钮(type="submit"),适合用于表单提交场景。

设置链接尺寸:size 属性

默认尺寸为 medium(md)。通过size属性可以切换为小、大、特大、超特大:

<x-filament::link size="sm"> New user </x-filament::link> <x-filament::link size="lg"> New user </x-filament::link> <x-filament::link size="xl"> New user </x-filament::link> <x-filament::link size="2xl"> New user </x-filament::link>

这里需要说明文档与实现的一个细节差异:文档示例中的2xl属于自定义字符串尺寸(直接作为 CSS 类fi-size-2xl输出,需要你自己提供对应的 Tailwind 类);而组件内置的枚举尺寸定义在 packages/support/src/Enums/Size.php,实际包含xssmmdlgxl五种:

enum Size: string { case ExtraSmall = 'xs'; case Small = 'sm'; case Medium = 'md'; case Large = 'lg'; case ExtraLarge = 'xl'; }

源码 link.blade.php 中,命中枚举的尺寸会映射为fi-size-{value}类,未命中的字符串则原样作为 class 输出。对应样式在 link.css:fi-size-xstext-xsfi-size-smtext-smmd/lg/xl三者统一为text-sm并加大图标与文字间距。

设置字体粗细:weight 属性

默认字重为semibold。可取值包括thinextralightlightnormalmediumsemiboldboldextraboldblack

<x-filament::link weight="thin"> New user </x-filament::link> <x-filament::link weight="normal"> New user </x-filament::link> <x-filament::link weight="semibold"> New user </x-filament::link> <x-filament::link weight="black"> New user </x-filament::link>

这些取值与枚举 packages/support/src/Enums/FontWeight.php 一一对应,命中枚举时渲染为fi-font-{value}类,未命中时原样作为 class 输出。

除了内置字重,你也可以直接传入自定义 CSS 类,例如利用 Tailwind 的任意值语法覆盖字重:

<x-filament::link weight="md:font-[650]"> New user </x-filament::link>

更改链接颜色:color 属性

默认颜色为 primary(主题色)。可切换为dangergrayinfosuccesswarning

<x-filament::link color="danger"> New user </x-filament::link> <x-filament::link color="gray"> New user </x-filament::link> <x-filament::link color="info"> New user </x-filament::link> <x-filament::link color="success"> New user </x-filament::link> <x-filament::link color="warning"> New user </x-filament::link>

颜色的底层渲染由 packages/support/src/View/Components/LinkComponent.php 中的getColorMap()完成:它通过ComponentColorMap::make($color)把颜色值映射为textdark:text两套 CSS 变量(浅色模式使用gray[50]作为表面色、默认取 900 号色阶;深色模式则从最深色阶开始取gray[700]表面色、默认取 200 号色阶),最终由 link.css 中的.fi-color规则以text-(--text)/dark:text-(--dark-text)的形式生效。链接未显式着色时,内部图标默认呈现灰阶(text-gray-400 dark:text-gray-500)。

为链接添加图标:icon 与 icon-position

通过icon属性可以给链接加一个图标(图标相关用法参见 docs/08-styling/04-icons.md):

<x-filament::link icon="heroicon-m-sparkles"> New user </x-filament::link>

默认图标显示在文字之前;使用icon-position="after"可将其移到文字之后:

<x-filament::link icon="heroicon-m-sparkles" icon-position="after" > New user </x-filament::link>

icon-position对应枚举 packages/support/src/Enums/IconPosition.php,只有beforeafter两个值。在 link.blade.php 中,图标通过generate_icon_html()渲染在文字前后对应位置。此外还有两个进阶属性:

  • icon-alias:通过别名解析图标(配合FilamentIcon注册的别名体系使用);
  • icon-size:控制图标尺寸,当链接尺寸为xs/sm时默认使用IconSize::Small,其余尺寸下由图标默认值决定(见 link.blade.php)。

为链接添加提示:tooltip 属性

tooltip属性可以为链接添加悬浮提示:

<x-filament::link tooltip="Register a user"> New user </x-filament::link>

从 link.blade.php 可以看到,tooltip 通过 Alpine 指令x-tooltip实现,支持主题跟随(theme: $store.theme),且当tooltipHtmlable实例时允许渲染 HTML 内容(allowHTML)。工具提示还配合了禁用的行为联动:当链接disabled且带 tooltip 时,hrefx-on:wire:click等属性会被过滤,仅保留 tooltip 展示(见 link.blade.php)。

在链接上叠加徽章:badge 插槽与 badge-color

你可以通过badge插槽在链接右上角叠加一个徽章(badge),常用于未读数量等场景:

<x-filament::link> Mark notifications as read <x-slot name="badge"> 3 </x-slot> </x-filament::link>

徽章的颜色默认也是 primary,可通过badge-color属性单独更改:

<x-filament::link badge-color="danger"> Mark notifications as read <x-slot name="badge"> 3 </x-slot> </x-filament::link>

徽章的完整样式体系参见 docs/12-components/03-badge.md(其中 更改徽章颜色 一节列出了全部可用颜色)。在实现上(link.blade.php),徽章被包裹在.fi-link-badge-ctn容器中,通过绝对定位置于链接右上角(start-full-translate-y-3/4,RTL 下自动镜像),并复用BadgeComponent的颜色映射与fi-size-{size}尺寸类;徽章默认尺寸为xsSize::ExtraSmall),也可以用badge-size属性覆盖。

其他进阶属性

  • disabled:禁用链接,渲染aria-disabled="true"disabled属性,样式上降为opacity-70且不可点击(带 tooltip 时保留提示,见 link.css);
  • key-bindings:为链接绑定键盘快捷键,底层通过x-mousetrap.global实现,按下快捷键即触发点击(link.blade.php);
  • label-sr-only:隐藏文字但保留给屏幕阅读器(渲染为aria-label,并对 HTML 内容做转义防注入,见 link.blade.php);
  • loading-indicator(默认开启):当链接带wire:click/wire:target或为表单提交按钮时,自动显示加载指示器并在请求期间禁用(link.blade.php);
  • spa-mode:控制是否使用 Filament 的 SPA 软导航模式生成href

源码中的双实现路径

从源码结构看,Link 组件的渲染逻辑存在两条等价的实现路径:

  1. Blade 视图渲染:packages/support/resources/views/components/link.blade.php 是组件标签的主要入口,@props声明全部属性后逐段拼装 HTML;
  2. PHP 字符串生成:support 包还提供了 trait packages/support/src/View/Concerns/CanGenerateLinkHtml.php,其中的generateLinkHtml()方法以纯 PHP 方式生成同样的标记,供非 Blade 上下文(例如需要动态生成 HTML 字符串的组件)复用,二者共享相同的属性解析、颜色映射与加载指示器逻辑。

两条路径最终都依赖LinkComponent::getColorMap()计算颜色变量、fi-link基类以及fi-size-*fi-font-*修饰类,保证了视觉与行为的一致性。

小结

<x-filament::link>是 Filament 中"看起来像链接、用起来像按钮"的通用交互元素:tag决定底层语义标签,size/weight/color控制外观,icon/tooltip/badge增强信息表达,disabled/key-bindings/loading-indicator则覆盖了表单与键盘可达性等实战细节。无论你是要在资源页面、自定义页面还是普通 Blade 视图中放置一个可操作的文本入口,直接组合上述属性即可获得与 Filament 主题一致、并天然支持 Livewire 交互与无障碍访问的最终效果。

【免费下载链接】filamentA powerful open-source UI framework for Laravel • Build and ship apps & admin panels fast with Livewire项目地址: https://gitcode.com/GitHub_Trending/fi/filament

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询