Closed7

Leptosを触ってみる

nappanappa

ボイラープレート的なものがあったのでローカルで動かしてみる

# trunk : WASMで動かすWebアプリ用のバンドラ
# cargo-generate : gitリポジトリをテンプレートとして新規プロジェクトを作成
cargo install trunk cargo-generate

# 提供されているテンプレから作成。他にもstart-awsとかがある
# ドキュメント上だとOrganizationが `leptos-community` だったが `leptos-rs` にリダイレクトされてた
cargo generate --git https://github.com/leptos-community/start-csr

# 起動
trunk serve --port 3000 --open

起動した

nappanappa

コンポーネントの作成イメージ

use leptos::prelude::*;

#[component]
fn App() -> impl IntoView {
    let (count, set_count) = signal(0);

    view! {
        <button
            on:click=move |_| set_count.set(3)
        >
            "Click me: "
            {count}
        </button>
        <p>
            "Double count: "
            {move || count.get() * 2}
        </p>
    }
}

リアクティブな値は signal を使う。geter / setter がタプルで返ってくる

let (count, set_count) = signal(0);

view! マクロを使ってJSX記法を使えるっぽい

nappanappa

リアクティブな値を使うときにはクロージャを使って関数にしてあげる必要がある
getterそのまま使うとリアクティブとして扱われず1度だけしか評価されない(getterはあくまで大元の値のクローンするだけ)

        <p>
            <strong>"Reactive: "</strong>
            {move || count.get()}
        </p>
        <p>
            <strong>"Reactive shorthand: "</strong>
            {count}
        </p>
        <p>
            <strong>"Not reactive: "</strong>
            {count.get()}
        </p>

nappanappa

getter / setterのバリエーション

  • getter
    • read / with / get
  • setter
    • write / update / set

ロックをかけたり値をクローンするなりいろいろ
所有権が厳密なので使い方もそうなるのはそれはそう

Vue / Reactなどに明るくないので同じような機能が提供されているかは知らない

nappanappa

Rustの書き味やら厳密さがありつつ、既存のフレームワークライクに書けるところは良さげ
ちゃんとものを作り始めるとつらみが出てきそうだし(多分)、まだv1にもなってないのでこれから色々変わってくるものではあるが、とりあえず雰囲気だけはしれた

このスクラップは2025/01/17にクローズされました