8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 10

KinoLiveComponent を使って Livebook 上でコンポーネントを実装、表示する

Last updated at Posted at 2024-11-18

はじめに

Phoenix LievView ではコンポーネント(部品)を作り、 Web UI に組み込んで使用します

KinoLiveComponent を使うと、 Livebook 上でコンポーネントを実装し UI を表示できます

実装したノートブックはこちら

事前準備

KinoLiveComponent を使うためには、 Livebook とは別に Phoenix アプリケーションを起動している必要があります

KinoLiveComponent を使うということは、 Phoenix LiveView の Web UI を実装しようとしているはずです

その実装中のアプリケーションにも開発用に KinoLiveComponent を依存モジュールとして追加します

"mix.exs" の deps に {:kino_live_component, ">= 0.0.0", only: :dev} を追加しましょう

...
  defp deps do
    [
      ...,
      {:kino_live_component, ">= 0.0.0", only: :dev}
    ]
  end
...

追加したら mix deps.get でインストールしておきます

"lib/..._web/router.ex" に Livebook からアクセスするためのルートを用意しておきます

  import KinoLiveComponent.Plug, only: [allow_insecure_connection: 2]
...
  if Mix.env() == :dev do
    scope "/kino-live-component", KinoLiveComponent do
      pipe_through([:allow_insecure_connection])

      live("/", Live.Index)
    end
  end
...

また、 "config/dev.exs" で開発用に使っているポート番号(デフォルトでは 4000)を確認しましょう

config :elixir_mobile, ...Web.Endpoint,
  # Binding to loopback ipv4 address prevents access from other machines.
  # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
  http: [ip: {127, 0, 0, 1}, port: 4000],
  ...

この状態で mix phx.server を実行し、アプリケーションを起動しておきます

特に今作ろうとしているアプリケーションがない、とりあえず試したいだけ、という場合は KinoLiveComponent 自体を Phoenix アプリケーションとして使用します

具体的には以下のコマンドを実行してください

git clone git@github.com:anthonyshull/kino_live_component.git
cd kino_live_component
mix deps.get
iex --sname kino-live-component --cookie foobarbaz -S mix phx.server

Phoenix が 9999 ポートで起動します

セットアップ

Livebook で新しいノートブックを開き、セットアップセルで KinoLiveComponent をインストールします

このとき、 KinoLiveComponent の接続先を config で指定します

KinoLiveComponent 自体を接続先にしている場合、ローカルホストの 9999 ポートで起動しており、パスは /kino-live-component でルーティングしているため、 endpoint には http://localhost:9999/kino-live-component を指定することになります

Mix.install(
  [
    {:kino_live_component, "~> 0.0.3"}
  ],
  config: [
    kino_live_component: [
      endpoint: "http://localhost:9999/kino-live-component"
    ]
  ]
)

Phoenix.Component

Livebook のセルでコンポーネントを実装してみます

~H のシギルをインポートして簡単なラベルを作ってみましょう

import Phoenix.Component, only: [sigil_H: 2]

assigns = %{
  content: "Hello, Phoenix component!"
}

~H"""
<div class="p-3 bg-orange-500 text-white rounded-xl cursor-pointer">
  <%= @content %>
</div>
"""
|> KinoLiveComponent.component()

実行結果

スクリーンショット 2024-11-15 8.29.03.png

コンポーネントが表示されました

TailwindCSS もちゃんと効いているし、 assigns に入れた content も表示されています

Phoenix.LiveComponent

もちろん、 LiveComponent も実装できます

defmodule MyLiveComponent do
  use Phoenix.LiveComponent

  def render(assigns) do
    ~H"""
    <div class="p-3 bg-red-200 text-black rounded-lg">
      <%= @content %>
    </div>
    """
  end
end

assigns = %{
  content: "Hello, Phoenix live component!"
}

KinoLiveComponent.component(MyLiveComponent, assigns)

実行結果

スクリーンショット 2024-11-15 8.35.04.png

まとめ

Livebook 上でコンポーネントを実装し、表示することができました

試行錯誤しながら UI を作るときに使えそうですね

8
1
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
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?