9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel Livewire】ライフサイクルフックのhydrate、dehydrateとは何か

Last updated at Posted at 2022-05-17

事の発端

image.png

hydratedehydrateって何だよ。

解説しているブログとか記事が無い。調べてみるか

前提

livewireは、コンポーネント内のイベントが発火する度に、バックエンドで生成したHTMLをView側で受け取り差し替えています。
バックエンド側ではHTMLを渡すと同時にコンポーネント内のプロパティをオブジェクトに変換して渡しています。

先に結論

要約すると多分こうです。

フック 説明
hydrateFoo View側から送られてきた{ foo }オブジェクトを$fooに変換した後に実行される
dehydrateFoo PHP側でHTMLを生成した後に$foo{ foo }オブジェクトに変換する時に実行される

stackoverflowでの回答

サンプルコードとライフサイクル

class Counter extends Component
{
    public $count = 1;
 
    public function increment()
    {
        $this->count++;
    }
 
    public function render()
    {
        return view('livewire.counter');
    }
}
<div>
    <h1>{{ $count }}</h1>
 
    <button wire:click="increment">+</button>
</div>

image.png

どういう事?

サンプルのコードの動きを見てみる

chromeのlivewireデバッグ拡張機能で見てみます

image.png

+ボタンを押す

image.png

クリックで右側拡大表示

image.png

はい、生成したhtmlとオブジェクト{count : 2}を受け取っていますね

hydrateCountメソッドを追加してみよう

フック 説明
hydrateFoo 名前が$fooのプロパティがハイドレイトされた後に実行します

ライフサイクルフックにあるからどこかのタイミングで動くんだろう。試してみるか

サンプルのコードに処理を加えます

class Counter extends Component
{
    public $count = 1;

    public function increment()
    {
        $this->count++;
    }

+   public function hydrateCount()
+   {
+       $this->count++;
+   }

    public function render()
    {
        return view('livewire.counter');
    }
}

image.png

クリックします

image.png

クリックで右側拡大表示

image.png

生成されたHTMLの$countcountオブジェクト両方3ですね。

{count:1}をhydrateする時に実行されていると、ふむ・・・、よく分からんのでdehydrateの処理を書きます

dehydrateCountメソッドを追加してみよう

フック 説明
dehydrateFoo 名前が$fooのプロパティがデハイドレイトされる前に実行します
class Counter extends Component
{
    public $count = 1;

    public function increment()
    {
        $this->count++;
    }

+   public function dehydrateCount()
+   {
+       $this->count++;
+   }

    public function render()
    {
        return view('livewire.counter');
    }
}

image.png

ん?2??????
HTML内の$countは1だけどオブジェクトのcountは2??

クリックして見るか

image.png

クリックで右側拡大表示

image.png

なるほど、HTML内の$countは3でオブジェクトのcountは4と

hydrateはオブジェクトをphpの変数に変換的な事をする時に走って、dehydrateはphpの変数をオブジェクトにして返す時に走ってるんや!!

dehydrateCountメソッドがある場合の流れ

図にするとこう、ページを開いた時の流れ。

$countが1の時にHTMLを生成しているのでHTML内では1が表示される。
HTML生成後に加算されているのでオブジェクトcountは2

初回以降の流れ

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?