会话属性

您是视觉学习者吗?
使用我们深入的屏幕录制掌握 Livewire
立即观看

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

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

#[Session] 属性类似于 #[Url] 属性。它们都适用于类似的场景。主要区别在于 #[Session] 会在不修改 URL 的查询字符串的情况下持久化值,有时需要这样,有时不需要。

基本用法

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

<?php
 
use Livewire\Attributes\Session;
use Livewire\Component;
use App\Models\Post;
 
class ShowPosts extends Component
{
#[Session]
public $search;
 
protected function posts()
{
return $this->search === ''
? Post::all()
: Post::where('title', 'like', '%'.$this->search.'%');
}
 
public function render()
{
return view('livewire.show-posts', [
'posts' => $this->posts(),
]);
}
}

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

性能影响

由于 Laravel 会话在每次请求期间加载到内存中,因此通过在用户的会话中存储过多内容,您可以降低给定用户的整个应用程序的性能。

设置自定义键

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

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

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

<?php
 
use Livewire\Attributes\Session;
use Livewire\Component;
 
class ShowPosts extends Component
{
#[Session(key: 'search')]
public $search;
 
// ...
}

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

此外,如果您想根据组件中的其他属性动态生成键,可以使用以下大括号表示法

<?php
 
use Livewire\Attributes\Session;
use Livewire\Component;
use App\Models\Author;
 
class ShowPosts extends Component
{
public Author $author;
 
#[Session(key: 'search-{author.id}')]
public $search;
 
// ...
}

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