Skip to content

Js

#[Js] 属性指定返回要在客户端执行的 JavaScript 代码的方法,提供从服务器端操作触发客户端行为的方式。

基本用法

#[Js] 属性应用到返回 JavaScript 表达式的方法上:

php
<?php // resources/views/components/post/⚡create.blade.php

use Livewire\Attributes\Js;
use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    public $title = '';

    public function save()
    {
        Post::create(['title' => $this->title]);

        return $this->showSuccessMessage(); // [tl! highlight]
    }

    #[Js] // [tl! highlight:start]
    public function showSuccessMessage()
    {
        return "alert('帖子保存成功!')";
    } // [tl! highlight:end]
};

save() 操作完成时,JavaScript 表达式 alert('帖子保存成功!') 将在客户端执行。

替代方法:使用 js() 方法

除了 #[Js] 属性外,您还可以使用 js() 方法处理一次性 JavaScript 表达式:

php
<?php // resources/views/components/post/⚡create.blade.php

use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    public $title = '';

    public function save()
    {
        Post::create(['title' => $this->title]);

        $this->js("alert('帖子保存成功!')"); // [tl! highlight]
    }
};

对于简单表达式,js() 方法更简洁,而 #[Js] 方法更适合可重用或复杂的 JavaScript 逻辑。

访问 $wire

您可以在 JavaScript 表达式中访问组件的 $wire 对象:

php
#[Js]
public function resetForm()
{
    return <<<'JS'
        $wire.title = ''
        $wire.content = ''
        alert('表单已重置')
    JS;
}

何时使用

在需要以下功能时使用 #[Js]

  • 在服务器操作后显示客户端警告或通知
  • 触发 JavaScript 动画或过渡效果
  • 在不重新渲染的情况下更新客户端状态
  • 从多个位置执行可重用的 JavaScript 逻辑
  • 与第三方 JavaScript 库集成

JavaScript 操作与 #[Js] 方法的区别

有一个重要的区别:

  • JavaScript 操作$js.methodName)完全在客户端运行,不发起服务器请求
  • #[Js] 方法先在服务器上运行,然后在客户端执行返回的 JavaScript
php
<?php // resources/views/components/⚡example.blade.php

use Livewire\Attributes\Js;
use Livewire\Component;

new class extends Component
{
    public $count = 0;

    // 返回 JavaScript 的服务器端方法
    #[Js]
    public function showCount()
    {
        return "alert('计数是:{$this->count}')";
    }
};
blade
<div>
    <button wire:click="showCount">显示计数</button>
</div>

@script
<script>
    // 纯客户端 JavaScript 操作
    $js.incrementLocal = () => {
        console.log('未发起服务器请求')
    }
</script>
@endscript

了解更多

有关 Livewire 中 JavaScript 集成的更多信息,请参阅: