本文へスキップ

コンポーネント

状態を持つ画面には View を実装します。状態を持たない部品には、Element を返す関数が使えます。

#コンポーネントの定義

struct Greeting {
    name: String,
}

impl View for Greeting {
    fn render(&mut self, _cx: &mut ViewContext<'_, Self>) -> impl IntoElement {
        text(format!("Hello, {}", self.name))
    }
}

子ビューも、自身の状態を持たないときは Element を返す関数にできます。

#プリミティブ

div、text、button、text_input、text_area、img、svg、custom_shader、VirtualList が基本の部品です。submit_button はいちばん近い form を送信します。Markdown は features = ["markdown"]、Editor、CodeBlock、DiffView は features = ["editor"] で利用でき、Terminal も任意機能です。

#複合コンポーネント

let checkbox = Checkbox::new(self.checked);
checkbox
    .root()
    .flex_row()
    .gap(8.0)
    .on_click(toggle)
    .child(checkbox.indicator_with(div().size(16.0, 16.0)))
    .child(text("Remember this device"))

フォーカスと値がつながったままになるよう、パーツはその所属するルートの下に置きます。

#制御された状態

値はビューに保持し、コンストラクターへ渡し、リスナーから更新します。そのあと cx.invalidate() を呼び出します。状態の所有者はビューです。

#コンポーネントの種類

コンポーネントリファレンスでは、フォーム、オーバーレイ、メニュー、テーブル、ツリーなどを扱います。examples/base_ui_components.rs はギャラリーです。

#各パーツのスタイル

表示される各パーツに、チェーンできるスタイルメソッドを適用します。パーツはスタイルなしで提供されるので、色とレイアウトはアプリ側のものです。TabsState や SelectState のような型は、独自の見た目のために現在の状態を公開します。