Skip to content
全部文档

Session 属性

Livewire 通过 #[Session] 属性,可轻松在页面刷新/跳转之间持久化属性值。

给组件属性加上 #[Session] 后,Livewire 会在该属性每次变更时将其值存入 session。这样刷新页面时,Livewire 会从 session 取出最新值并用于组件。

#[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.'%');
    }
};

因为 $search 属性加了 #[Session],用户输入搜索值后刷新页面,搜索值仍会保留。每次 $search 更新时,新值都会存入用户 session,并在各次页面加载中使用。

WARNING

性能影响

由于 Laravel session 会在每次请求时加载到内存,在用户 session 中存放过多内容会拖慢该用户整次应用请求的性能。

设置自定义键

使用 #[Session] 时,Livewire 会用动态生成的键(由组件名与属性名组合)把属性值存入 session。

这确保同一组件各实例的属性共用同一 session 值,也确保不同组件中同名属性不会冲突。

若要完全控制某个属性所用的 session 键,可传入 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」,session 键将变为:search-4