You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何使用Repeater在子组件中渲染数据

Laravel组件数据传递问题解决

问题根源

Filament框架里,form()方法的执行时机比mount()早。你在mount()中给$this->array赋值,但此时form()已经完成了子组件的初始化,传给DisplayForm::make()的$this->array还是初始的null,这就是子组件日志显示数据为空的原因。

解决方案

1. 调整父组件数据传递时机

不需要在mount()里中转数据,直接在form()中从$record读取目标数组,因为form()方法可以直接访问$this->record:

public function form(Form $form): Form
{
    return $form
        ->schema([
            DisplayForm::make($this->record->some_array),
        ]);
}

// 保留mount方法用于日志或其他逻辑(可选)
public function mount($record): void
{
    $this->record = $record;
    Log::info('data', ['data' => $this->record->some_array]);
}

2. 修正子组件Repeater初始化逻辑

子组件里不用依赖afterStateHydrated来设置状态,直接用default()方法传递初始数据即可:

public static function make(array $data): Component
{
    Log::info('data', ['data' => $data]); // 现在能正常获取数据
    return Repeater::make('conditions')
        ->schema([
            TextInput::make('array_key_1')
                ->label('字段1'),
            TextInput::make('array_key_2')
                ->label('字段2'),
        ])
        ->default($data)
        ->reorderable();
}

进阶优化:直接绑定模型字段(编辑场景)

如果你的some_array是模型的JSON字段,更简洁的做法是让Repeater直接绑定该字段,Filament会自动处理数据的读取和保存,无需自定义子组件:

public function form(Form $form): Form
{
    return $form
        ->schema([
            Repeater::make('some_array')
                ->schema([
                    TextInput::make('array_key_1')
                        ->label('字段1'),
                    TextInput::make('array_key_2')
                        ->label('字段2'),
                ]),
        ]);
}

内容的提问来源于stack exchange,提问作者ang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:07:15