Day 09 | Livewire 生命周期勾 Lifecycle Hooks

在 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 则分成了 hydratedehydrate。其中的差异则在 hydrate 是 Livewire 在将 JS 转至 PHP 时触发执行,而 dehydrate 则是 PHP 转 JS 时执行。

参考自: https://stackoverflow.com/questions/65500135/what-does-it-mean-to-hydrate-and-dehydrate-a-laravel-livewire-component


实际操作

这边我宣告了三个计数器,分别放置於对应的生命周期钩子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

最後能够发现,updated 只有在 <input> 中的 wire:model() 所产生的变动会有反应。透过按钮触发 wire:click() 再由後端直接赋予数值的则不会触发 update。这边就与 Vue.js 的 updatedbeforeUpdate 有所差异。

hydrate

hydratedehydrate,在每个 请求 都会被触发到,即便是没有造成值的变动都会触发。

只要有从前端送请求到後端都会触发

虽然无法从这个范例观察到 hydratedehydrate 的差异,但我使用 Livewire 写了几个专案也没有用到 hydratedehydrate 所以当我有用到时再写篇文章跟大家分享吧!!


<<:  11.unity地图障碍物(Tilemap Collider 2D)

>>:  Day 11. Hashicorp Nomad: Sidecar task

Day 2 Docker 基本概念

在正式使用 docker 之前,需要先知道以下三个元素:映像档 ( Image )、容器 ( Con...

[Day1] 话说没钱有没钱的作法

外接硬碟一天到晚故障?云端硬碟资料常莫明奇妙消失? 虽然没什麽钱,但...... 图引自萌娘百科。内...

认识HTML(二)

1.VS code 写网页的编辑器有许多种,我使用的编辑器是Visual Studio Code(简...

初学者跪着学JavaScript Day16 : 阵列Array 迭代的小小秘密

一日客语:中文:早安 客语:anˋzoˋ安走 前提:在学习Array.methods时会想知道他是如...

【Day 3】机器学习基本功(一)

机器学习三大步骤 定义一个模型(model) 从模型里挑出好的函式(function) 经由演算法找...