自定义字段
简介
Livewire 组件是在用户浏览器中保存其状态的 PHP 类 。当网络请求发起时,其状态发送到服务器,在 Livewire 组件中填入公共属性,这些属性可以如同其他 PHP 类属性一样用同样的方式访问。
假设你的 Livewire 组件有一个公共属性 $name
。你可以以两种方式将该属性绑定到 Livewire 组件的 HTML 输入字段中:使用 wire:model
属性或者通过 Alpine.js 属性 entangling使用它:
<x-dynamic-component
:component="$getFieldWrapperView()"
:field="$field"
>
<input wire:model="name" />
<!-- Or -->
<div x-data="{ state: $wire.$entangle('name') }">
<input x-model="state" />
</div>
</x-dynamic-component>
当用户输入到输入字段时,$name
属性在 Livewire 组件类上同步更新。当用户提交表单时,$name
属性发送到服务器,并可以将其保存。
这是 Filament 中字段的基本工作原理。每个字段在 Livewire 中分配了一个公共属性,该字段的状态存入其中。我们将该属性名称之为字段的 “state path”。你可以在字段视图中使用 $getStatePath()
函数访问该字段的状态路径(state path):
<x-dynamic-component
:component="$getFieldWrapperView()"
:field="$field"
>
<input wire:model="{{ $getStatePath() }}" />
<!-- Or -->
<div x-data="{ state: $wire.$entangle('{{ $getStatePath() }}') }">
<input x-model="state" />
</div>
</x-dynamic-component>
如果你的组件严重依赖第三方库,我们建议你使用 Filament asset 系统异步加载 Alpine.js 组件。这能确保 Alpine.js 组件只会在需要时加载,而不会在每个页面上都加载。要了解如何实现该加载方式,请查看静态资源文档。
自定义字段类
你可以创建自己的自定义字段类和视图,使之在你的整个项目中重复使用,甚至可以将之做成插件发布到社区。
要创建自定义字段类和视图,请使用如下命令:
php artisan make:filament-form-field LocationPicker
这将会生成如下组件类:
use Filament\Forms\Components\Field;
class LocationPicker extends Field
{
protected string $view = 'filament.forms.components.location-picker';
}
它同时会生成一个视图文件:resources/views/filament/forms/components/location-picker.blade.php
。
NOTE
Filament 表单字段不是 Livewire 组件。在 表单字段类中定义公共属性和方法,不会让他们可以在 Blade 视图中可访问。