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。