サウロンフレームワークは、クライアントサイドとサーバーサイドのWebアプリケーションを構築するための強力なツールです。特にそのイベント処理システムは、ユーザインタラクションやDOM操作において極めて重要な役割を果たします。以下では、このシステムの基本概念から高度な応用までを解説します。
イベント処理の基礎:サウロンのイベントモデル理解
サウロンのイベント処理は、ウェブ標準のイベントモデルに基づいており、Rust言語の型安全性を利用した信頼性の高い実装が特徴です。ここでは主要なイベントタイプとそれに対応する関数について説明します。イベントタイプと列挙型
サウロンでは以下のイベントタイプが定義されています:- マウスイベント:クリック、ダブルクリック、マウス押下、リリースなど。
- キーボードイベント:キー押下、キー離上など。
- フォームイベント:入力、変更、送信など。
- タッチイベント:タッチ開始、移動、終了など。
pub enum MouseBtn {
Left = 0, // 左クリック
Middle = 1, // 中央クリック(ホイール)
Right = 2, // 右クリック
Backward = 3, // ブラウザバックキー
Forward = 4 // ブラウザフォワードキー
}
基本的なイベントハンドラ
イベントを処理するための基本関数`attach_event`を使用できます。これは任意のイベントにコールバックを登録可能です:fn attach_event(event_name: &str, handler: F) -> Attribute<MSG> where F: FnMut(Event) -> MSG + 'static, MSG: 'static,
頻出のイベント処理:クリックからフォーム送信まで
サウロンは一般的なイベントに対して専用のハンドラを提供しており、コードの簡潔さと可読性を向上させます。クリックイベント処理
クリックイベントの処理には`click_handler`関数が使用されます:fn click_handler例としてカウンター機能での使用方法を示します:(handler: F) -> Attribute<MSG> where F: FnMut(MouseEvent) -> MSG + 'static, MSG: 'static,
<button click_handler=|_| Msg::Increment >+</button>
<button click_handler=|_| Msg::Decrement >-</button>
<button class="count" click_handler=|_| Msg::Reset >{text(self.count)}</button>
入力イベント処理
フォーム入力の処理には`input_handler`関数が便利です:
struct InputEvt {
pub event: web_sys::Event,
}
impl InputEvt {
pub fn get_value(&self) -> String {
// 実装省略
}
}
例としてテキスト入力の処理を示します:
<input
type="text"
placeholder="タスクを入力..."
input_handler=|e| Msg::UpdateInput(e.get_value())
/>
キーボードイベント処理
キーボード操作のイベント処理には`key_down_handler`関数が利用されます:fn key_down_handlerEnterキーの検知例を以下に示します:(handler: CB) -> Attribute<MSG> where CB: FnMut(KeyboardEvent) -> MSG + 'static, MSG: 'static,
<input
type="text"
key_down_handler=|e| {
if e.key() == "Enter" {
Msg::AddTask
} else {
Msg::NoAction
}
}
/>
高度なイベント処理:カスタムイベントとイベント委譲
サウロンはカスタムイベントやイベント委譲にも対応しています。カスタムイベントの追加
コンポーネントのマウント時に動作を行うための`mount_handler`関数があります:fn mount_handler(handler: F) -> Attribute<MSG> where F: FnMut(MountEvt) -> MSG + 'static, MSG: 'static,
イベント委譲による性能最適化
大量の同様な要素に対するイベント処理では、イベント委譲が効率的です。親要素に単一のイベントハンドラを設定することで、子要素ごとに個別のハンドラを設定する必要がなくなります。 リストアイテムのイベント委譲例を以下に示します:
<ul on_click=|e: MouseEvent| {
let target = e.target();
if let Some(item) = target.dyn_ref::<HtmlElement>() {
if let Some(id) = item.get_attribute("data-id") {
Msg::ItemSelected(id)
} else {
Msg::NoAction
}
} else {
Msg::NoAction
}
}>
{
items.iter().map(|item| {
<li data-id={item.id}>{text(&item.name)}</li>
})
}
</ul>
実践例:複雑なコンポーネントの作成
いくつかの具体的な例を通じてサウロンのイベント処理の柔軟性を紹介します。インタラクティブなボタンコンポーネント
以下の例は、クリック回数に応じてテキストを更新するボタンコンポーネントです:
button(
[click_handler(|_| Msg::Clicked)],
[text!("Button clicked {} times", self.click_count)]
)
複雑なフォーム処理
待办事项管理アプリの例として以下のコードを示します:
// 全項目のトグル
<input
type="checkbox"
id="toggle-all"
click_handler(|_| Msg::ToggleAll)
/>
// 単一項目のトグル
<input
type="checkbox"
checked={entry.completed}
click_handler(move |_| Msg::Toggle(entry_id))
/>
// 項目の削除
<button
class="destroy"
click_handler(move |_| Msg::Delete(entry_id))
/>