会话属性
您是视觉学习者吗?
使用我们深入的屏幕录制掌握 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