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('Post saved successfully!')";
    } // [tl! highlight:end]
};

save() 操作完成时,JavaScript 表达式 alert('Post saved successfully!') 将在客户端执行。

替代方案:使用 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('Post saved successfully!')"); // [tl! highlight]
    }
};

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

访问 $wire

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

php
#[Js]
public function resetForm()
{
    return <<<'JS'
        $wire.title = ''
        $wire.content = ''
        alert('Form has been reset')
    JS;
}

何时使用

在需要以下情况时使用 #[Js]

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

JavaScript 操作 vs #[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;

    // Server-side method that returns JavaScript
    #[Js]
    public function showCount()
    {
        return "alert('Count is: {$this->count}')";
    }
};
blade
<div>
    <button wire:click="showCount">Show Count</button>
</div>

<script>
    // Pure client-side JavaScript action
    this.$js.incrementLocal = () => {
        console.log('No server request made')
    }
</script>

了解更多

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