在 Vue.js 有的生命周期在 Livewire 中也都有,除此之外在 Livewire 中各自变数也有各自的生命周期,让你能更方便的对各个变数周期事件单独做操作。
以下就来看看有哪些吧:
Hooks | 叙述 |
---|---|
mount | 在元件选染完成後只会执行一次,且执行在 render() 之前。 |
hydrate | 每个请求时都会执行一次。 |
hydrateFoo | 同上,但只限 $foo 呼叫後後执行。 |
dehydrate | 每个请求时都会执行一次。 |
dehydrateFoo | 同上,但只限 $foo 呼叫後後执行。 |
updating | 当透过 wire:model 进行更改之前执行。 |
updated | 当透过 wire:model 进行更改之後执行。 |
updatingFoo | 跟上面updating 一样但只限更改 $foo 前执行。 |
updatedFoo | 跟上面updated 一样但只限更改 $foo 後执行。 |
updatingFooBar | 跟上面updating 一样但这边能监听里数个变数,在更改 $fooBar 或是$foo_bar 前执行。 |
updatedFooBar | 跟上面updating 一样但这边能监听里数个变数,在更改 $fooBar 或是$foo_bar 後执行。 |
备注:
dehydrate
是在 Livewire v2 才有的新东西。原先hydrate
的功能是处理每个请求,包含wire:click
透过 function 去修改变数时都能执行。但到了 Livewire v2 则分成了hydrate
及dehydrate
。其中的差异则在hydrate
是 Livewire 在将 JS 转至 PHP 时触发执行,而dehydrate
则是 PHP 转 JS 时执行。
这边我宣告了三个计数器,分别放置於对应的生命周期钩子hydrate
,dehydrate
,updated
中。好来显示我们做哪些事情会使其被触发。而在前端页面也分别显示了这三个变数,并多用了一个$title
来透过按钮触发 function
去更改,以及直接在 <input>
中用 wire:model($title)
的方式来看看分别会触发哪些值。
可以到 DEMO 页面来玩玩看!
<?php
namespace App\Http\Livewire\Example;
use Livewire\Component;
class Day9 extends Component
{
public $counter_hydrate = 0;
public $counter_dehydrate = 0;
public $counter_updated = 0;
public $title = 'init';
public function mount()
{
$this->title = 'Hello World';
}
public function render()
{
return view('livewire.example.day9');
}
public function hydrate()
{
$this->counter_hydrate++;
}
public function dehydrate()
{
$this->counter_dehydrate++;
}
public function updated()
{
$this->counter_updated++;
}
// 以下为自订函式
public function updateTitle($newText)
{
// 透过按钮触发,因为不是透过 wire:model 去修改,所以不会触发 updated
$this->title = $newText;
}
}
<div class="text-center">
<h2>Day9: Lifecycle Hooks</h2>
<h3>{{ $title }}</h3>
<h5>hydrate counter: {{ $counter_hydrate }}</h5>
<h5>dehydrate counter: {{ $counter_dehydrate }}</h5>
<h5>updated counter: {{ $counter_updated }}</h5>
<button class="ui button" wire:click="updateTitle('嗨嗨')">UpdateTitle</button>
<div class="ui input">
<input type="text" wire:model="title">
</div>
</div>
最後能够发现,updated
只有在 <input>
中的 wire:model()
所产生的变动会有反应。透过按钮触发 wire:click()
再由後端直接赋予数值的则不会触发 update
。这边就与 Vue.js 的 updated
、 beforeUpdate
有所差异。
而 hydrate
及 dehydrate
,在每个 请求 都会被触发到,即便是没有造成值的变动都会触发。
只要有从前端送请求到後端都会触发
虽然无法从这个范例观察到 hydrate
及 dehydrate
的差异,但我使用 Livewire 写了几个专案也没有用到 hydrate
及 dehydrate
所以当我有用到时再写篇文章跟大家分享吧!!
<<: 11.unity地图障碍物(Tilemap Collider 2D)
>>: Day 11. Hashicorp Nomad: Sidecar task
在正式使用 docker 之前,需要先知道以下三个元素:映像档 ( Image )、容器 ( Con...
外接硬碟一天到晚故障?云端硬碟资料常莫明奇妙消失? 虽然没什麽钱,但...... 图引自萌娘百科。内...
1.VS code 写网页的编辑器有许多种,我使用的编辑器是Visual Studio Code(简...
一日客语:中文:早安 客语:anˋzoˋ安走 前提:在学习Array.methods时会想知道他是如...
机器学习三大步骤 定义一个模型(model) 从模型里挑出好的函式(function) 经由演算法找...