Skip to content

其他 Actions

ScriptAction

执行自定义 JavaScript 代码。

php
use Lartrix\\Schema\\Actions\\ScriptAction;

ScriptAction::make('
    console.log("Debug:", this.formData);
    this.formData.name = this.formData.name.toUpperCase();
');

谨慎使用

ScriptAction 允许执行任意 JavaScript 代码,这会破坏声明式编程的优势。

何时可以使用:

  • 需要访问浏览器 API(如 localStorage、console)
  • 需要执行复杂的数据转换逻辑
  • 临时调试代码

安全风险:

  • 可能引入 XSS 漏洞
  • 难以维护和测试
  • 破坏组件的可预测性

推荐替代方案:

  • 使用 SetAction 更新状态
  • 使用 CallAction 调用预定义方法
  • 使用 FetchAction 与后端交互
  • 在后端处理复杂逻辑

如果必须使用,请确保:

  • 不要在 script 中处理用户输入
  • 不要在 script 中存储敏感信息
  • 添加详细的代码注释

EmitAction

触发自定义事件,用于组件间通信。

php
use Lartrix\\Schema\\Actions\\EmitAction;

// 触发自定义事件
EmitAction::make('refresh-list');

// 带参数
EmitAction::make('item-selected', ['{{ item.id }}']);

在父组件中监听:

php
CrudPage::make('标题')
    ->on('refresh-list', [
        CallAction::make('loadData'),
    ]);

CopyAction

复制文本到剪贴板。

php
use Lartrix\\Schema\\Actions\\CopyAction;

Button::make('复制链接')
    ->on('click', [
        CopyAction::make('https://example.com/item/{{ id }}'),
        CallAction::make('\$message.success', ['链接已复制']),
    ]);

WebSocketAction

发送 WebSocket 消息。

php
use Lartrix\\Schema\\Actions\\WebSocketAction;

WebSocketAction::make('chat-channel')
    ->action('send-message')
    ->payload(['text' => '{{ message }}']);

Action 组合

在实际应用中,经常需要组合多个 Action:

删除确认流程

php
Button::make('删除')
    ->type('error')
    ->on('click', [
        // 显示确认对话框
        CallAction::make('\$dialog.warning', [
            '确认删除',
            '此操作不可恢复',
            [
                'positiveText' => '确认删除',
                'negativeText' => '取消',
                'onPositiveClick' => [
                    // 显示加载状态
                    SetAction::make('deleting', true),
                    // 发送删除请求
                    FetchAction::make('/api/items/{{ slotData.row.id }}')
                        ->delete()
                        ->then([
                            CallAction::make('\$message.success', ['删除成功']),
                            CallAction::make('loadData'),
                        ])
                        ->catch([
                            CallAction::make('\$message.error', ['删除失败']),
                        ])
                        ->finally([
                            SetAction::make('deleting', false),
                        ]),
                ],
            ],
        ]),
    ]);

表单提交流程

php
Button::make('提交')
    ->type('primary')
    ->on('click', [
        // 验证
        IfAction::make('{{ formData.title && formData.content }}')
            ->true([
                SetAction::make('submitting', true),
                FetchAction::make('/api/posts')
                    ->post()
                    ->body(['title' => '{{ formData.title }}', 'content' => '{{ formData.content }}'])
                    ->then([
                        SetAction::make('visible', false),
                        SetAction::make('formData', ['title' => '', 'content' => '']),
                        CallAction::make('\$message.success', ['发布成功']),
                        CallAction::make('loadData'),
                    ])
                    ->finally([
                        SetAction::make('submitting', false),
                    ]),
            ])
            ->false([
                CallAction::make('\$message.error', ['请填写标题和内容']),
            ]),
    ]);

基于 MIT 许可发布