Skip to content

会话属性

Livewire 使用 #[Session] 属性轻松地在页面刷新/更改之间持久化属性值。

通过将 #[Session] 添加到组件中的属性,Livewire 将在每次更改时将该属性的值存储在会话中。这样,当刷新页面时,Livewire 将从会话中获取最新值并在组件中使用它。

#[Session] 属性类似于 #[Url] 属性。它们在类似的场景中都很有用。主要区别在于 #[Session] 持久化值而不修改 URL 的查询字符串,这有时是需要的;有时则不是。

基本用法

这是一个 show-posts 组件,它允许用户通过存储在 $search 属性中的字符串过滤可见的帖子:

php
<?php // resources/views/components/⚡show-posts.blade.php

use Livewire\Attributes\Computed;
use Livewire\Attributes\Session;
use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    #[Session] // [tl! highlight]
    public $search;

    #[Computed]
    public function posts()
    {
        return $this->search === ''
            ? Post::all()
            : Post::where('title', 'like', '%'.$this->search.'%');
    }
};

因为 #[Session] 属性已添加到 $search 属性,所以在用户输入搜索值后,他们可以刷新页面,搜索值将被持久化。每次更新 $search 时,其新值将存储在用户的会话中,并在页面加载时使用。

性能影响

由于 Laravel 会话在每个请求期间都会加载到内存中,因此通过在用户的会话中存储过多内容,你可能会减慢特定用户的整个应用程序的性能。

设置自定义键

使用 [#Session] 时,Livewire 将使用由组件名称和属性名称组合而成的动态生成的键将属性值存储在会话中。

这确保跨组件实例的属性将使用相同的会话值。它还确保来自不同组件的同名属性不会冲突。

如果你想完全控制 Livewire 用于给定属性的会话键,可以传递 key: 参数:

php
<?php

use Livewire\Attributes\Session;
use Livewire\Component;

class ShowPosts extends Component
{
    #[Session(key: 'search')] // [tl! highlight]
    public $search;

    // ...
}

当 Livewire 存储和检索 $search 属性的值时,它将使用给定的键:"search"。

此外,如果你想从组件中的其他属性动态生成键,可以使用以下花括号表示法:

php
<?php

use Livewire\Attributes\Session;
use Livewire\Component;
use App\Models\Author;

class ShowPosts extends Component
{
    public Author $author;

    #[Session(key: 'search-{author.id}')] // [tl! highlight]
    public $search;

    // ...
}

在上面的示例中,如果 $author 模型的 id 是"4",会话键将变为:search-4