即将发布的 Livewire v3 功能和变更

发布于 作者:

Upcoming Livewire v3 Features and Changes image

上周三在 Laracon Online 上,Caleb Porzio 做了一个名为 "Livewire 的未来" 的演讲,演示了 Livewire v3 中计划的所有新功能。在本文中,我们将再次介绍这些功能,以防您错过了演讲或想再看一遍。

Laravel Livewire v3 发布日期

Caleb Porzio 刚刚宣布,Laravel Livewire v3 将于 7 月 20 日在 Laracon US 正式发布!

全新的基于 Alpine 的核心

整个 Livewire 核心已经重写。新的核心更多地依赖于 Alpine,在幕后使用其 Morph、History 和其他插件,这意味着 Livewire 具有更好的差异化,功能可以更快地构建,并且 Livewire 和 Alpine 之间有更少的重复。重构代码库并更多地依赖于 Alpine 也使添加了几项新功能成为可能。

Livewire 脚本、样式和 Alpine 会自动注入

在使用 Composer 安装 Livewire v2 之后,您必须手动将 @livewireStyles@livewireScripts 和 Alpine 添加到您的布局中。在 Livewire v3 中,您只需安装 Livewire,您需要的一切都会自动注入 - 包括 Alpine!

<!DOCTYPE html>
<html lang="en">
<head>
- <script src="//unpkg.com/alpinejs" defer></script>
- @livewireStyles
- @livewireScripts
</head>
<body>
...
</body>
</html>

无需构建步骤的热重载

Livewire v3 将包含无需构建步骤的热重载。只需在您的编辑器中保存一个文件,就可以立即在您的浏览器中看到这些更改,而不会破坏您的组件的状态!

wire:transition

Alpine 一直都有过渡动画,但 Livewire v3 将有一个名为 wire:transitionx-transition 包装器。将 wire:transition 添加到任何将使用 Livewire 显示或隐藏的元素,并获得那些非常不错的过渡动画。由于 wire:transition 在后台利用了 x-transition,因此所有修饰符(如 .opacity.duration)也将受到支持。

在您的 PHP 类中编写 JavaScript 函数

Livewire v3 将支持直接在您的后端 Livewire 组件中编写 JavaScript 函数。在您的组件中添加一个函数,在该函数上方添加一个 /** @js */ 注释,然后使用 PHP 的 HEREDOC 语法返回一些 JavaScript 代码,并从您的前端调用它。JavaScript 代码将在没有向您的后端发送任何请求的情况下执行。

<?php
 
namespace App\Http\Livewire;
 
class Todos extends \Livewire\Component
{
/** @prop */
public $todos;
 
/** @js */
public function clear()
{
return <<<'JS'
this.todo = '';
JS;
}
}
<div>
<input wire:model="todo" />
 
<button wire:click="clear">Clear</button>
</div>

/** @locked */ 属性

Livewire v3 将支持锁定属性 - 不能从前端更新的属性。在您的组件上的属性上方添加一个 /** @locked / 注释,如果有人尝试从前端更新该属性,Livewire 将抛出一个异常。

<?php
 
namespace App\Http\Livewire;
 
class Todos extends \Livewire\Component
{
/** @locked */
public $todos = [];
}

wire:model 默认情况下是延迟的

当 Livewire 首次发布时,它主要用于编写类似搜索的组件,这些组件需要非常“实时”的感觉,因此每次输入更新时自动向服务器发送更新是有意义的。现在,我们正在使用 Livewire 来构建各种类型的应用程序。随着 Livewire 及其使用的演变,我们已经意识到,“延迟”行为对于 95% 的表单更有意义,因此在 v3 中,“延迟”功能将成为默认设置。这将节省不必要的请求发送到您的服务器并提高性能。

当您需要在输入上使用“实时”功能时,可以使用 wire:model.live 来启用该功能。

注意:这是从 v2 到 v3 的少数几个重大变更之一。

请求被批处理

在 Livewire v2 中,如果您有多个组件使用 wire:poll 或调度和侦听事件,则这些组件中的每一个都会在每次轮询或事件时向服务器发送单独的请求。在 Livewire v3 中,存在对请求的智能批处理,以便 wire:poll、事件、侦听器和方法调用尽可能地批处理到一个请求中,从而节省更多请求并提高性能。

响应式属性

在 Livewire v2 中使用嵌套组件时,如果父组件上的属性被更新,子组件的数据不会自动保持同步。可以使用事件和侦听器进行手动解决方法,但这并非理想选择。在 Livewire v3 中,当您将一段数据传递给子组件时,在子组件中的属性上方添加一个 /** @prop */ 注释,然后在父组件中更新它,它将在子组件中更新。

<?php
 
namespace App\Http\Livewire;
 
class TodosCount extends \Livewire\Component
{
/** @prop */
public $todos;
 
public function render()
{
return <<<'HTML'
<div>
Todos: {{ count($todos) }}
</div>
HTML;
}
}

/** @modelable */ 属性

Livewire v2 中的另一个痛点是将属性从父组件“建模”到子组件。假设您想要一个 <livewire:todo-input /> 组件。将值传递进去,然后在子组件中更新它时自动在父组件中更新并不容易。在 Livewire v3 中,您可以在使用输入组件时添加 wire:model,然后在输入组件内部在您存储组件值的属性上方添加一个 /** @modelable */ 注释,Livewire 将处理其余工作。

<?php
 
namespace App\Http\Livewire;
 
class Todos extends \Livewire\Component
{
public $todo = '';
 
public $todos = [];
 
public function add() ...
{
$this->todos[] = $this->todo;
$this->todo = '';
}
 
public function render()
{
return <<<'HTML'
<div>
<livewire:todo-input wire:model="todo" />
<ul>
@foreach ($todo as $todos)
<li>{{ $todo }}</li>
@endforeach
</ul>
</div>
HTML;
}
}
<?php
 
namespace App\Http\Livewire;
 
class TodoInput extends \Livewire\Component
{
/** @modelable */
public $value = '';
 
public function render()
{
return <<<'HTML'
<div>
<input wire:model="value">
</div>
HTML;
}
}

使用 $parent 访问父组件的数据和方法

在 Livewire v3 中,将有一种新的方法来访问父组件的数据和方法。有一个新的 $parent 属性可以访问,用于在父组件上调用方法。

<?php
 
namespace App\Http\Livewire;
 
class TodoInput extends \Livewire\Component
{
/** @modelable */
public $value = '';
 
public function render()
{
return <<<'HTML'
<div>
<input
wire:model="value"
wire:keydown.enter="$parent.add()"
>
</div>
HTML;
}
}

@teleport

Livewire v3 还将包含一个新的 @teleport Blade 指令,它允许您“传送”一段标记并在 DOM 的另一个部分渲染它。这有时可以帮助避免模态框和侧边栏的 z-index 问题。

<div>
<button wire:click="showModal">Show modal</button>
 
@teleport('#footer')
<x-modal wire:model="showModal">
<!-- ... -->
</x-modal>
@endteleport
</div>

延迟组件

Livewire v3 将引入“延迟”组件。如果您有一个由于某些昂贵的查询而加载时间很长或渲染在并非总是打开的侧边栏中的组件,您可能希望等到它显示在页面上再加载它。在 Livewire v3 中,只需在渲染组件时添加一个 lazy 属性,它就不会被最初渲染。当它进入视口时,Livewire 将发出一个请求来渲染它。您还可以通过在组件上实现 placeholder 方法来添加占位符内容。

<div>
<button wire:click="showModal">Show modal</button>
 
@teleport('#footer')
<x-modal wire:model="showModal">
<livewire:example-component lazy />
</x-modal>
@endteleport
</div>
<?php
 
namespace App\Http\Livewire;
 
class ExampleComponent extends \Livewire\Component
{
public static function placeholder()
{
return <<<'HTML'
<x-spinner />
>>>
}
 
public function render() /** [tl! collapse:7] */
{
return <<<'HTML'
<div>
Todos: {{ count($todos) }}
</div>
HTML;
}
}

wire:navigate

在 Livewire v3 中,你可以将 `wire:navigate` 添加到任何锚点标签,当点击时,Livewire 将在后台获取页面,然后非常快速地替换 DOM,使你的应用程序更像 SPA。如果你也添加了 `.prefetch` 修饰符,Livewire 将在悬停链接时预取链接的内容,使其感觉更快!

<a href="/example" wire:navigate.prefetch>Example Page</a>

@persist

Livewire v3 将包含另一个非常酷的 Blade 指令 `@persist`。将 `@persist` 与 `wire:navigate` 结合使用,可以让你拥有跨页面更改而“持久化”的应用程序部分。一个很好的例子是播客播放器,它在你在应用程序中移动时继续播放。

<!DOCTYPE html>
<html lang="en">
<body>
<x-podcast-header />
 
<x-podcast-body>
{{ $slot }}
</x-podcast-body>
 
@persist('player')
<x-podcast-player />
@endpersist
</body>
</html>

新的 laravel-livewire.com 设计

最后但并非最不重要的是,Livewire 网站和文档将获得全新的设计!

结论

我们真的很期待 Livewire v3 中的所有这些新功能。如果你的业务依赖于 Livewire,并且你想支持 v3 的开发,或者想获得帮助来支持你的 Livewire 应用程序,请考虑加入官方的 支持计划

Jason Beggs photo

TALL 技术栈(Tailwind CSS、Alpine.js、Laravel 和 Livewire)顾问,以及 designtotailwind.com 的所有者。

分类
Cube

Laravel 新闻

加入 40,000 多名其他开发者,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理你的服务器,并在几秒钟内部署你的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自无妥协播客的两位经验丰富的开发者,现在可以为你的 Laravel 项目聘用。 ⬧ 固定费率为 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保你的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,使你的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

使用经验丰富的 Laravel 开发者(拥有 4-6 年的经验)为你的项目赋能,每月只需 2500 美元。获得 160 小时的专用专业知识和无风险的 15 天试用期。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

现在就变得幸运 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,它包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账、管理面板、用户仪表板、身份验证、现成的组件、统计数据、博客、文档等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

你无缝升级 Laravel 的合作伙伴,降低成本,加速创新,为成功企业提供服务

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强你的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变你的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在你的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包在你的 Laravel 应用程序中添加评论

阅读文章