メインコンテンツまでスキップ
Version: Next

条件レンダリング

If ブロック

条件付きでマークアップをレンダリングするには、それを if ブロックでラップします:

use yew::prelude::*;

html! {
if true {
<p>{ "True case" }</p>
}
};

Match ブロック

match 式は html! 内で直接使用でき、if/else と同じパターンに従います:

use yew::prelude::*;

let value: Option<String> = Some("hello".into());

html! {
match value {
Some(text) => <p>{text}</p>,
None => <p>{"Nothing here"}</p>,
}
};

単一要素のアームはブレースを省略できます。複数の子要素や let バインディングを持つアームにはブレースが必要です。

match は OR パターン(A | B)、分割代入、if ガードを含む、すべての標準的な Rust パターンをサポートします。網羅性は Rust コンパイラによってチェックされます。

if / match の本体内部のループ

if / else if / else / match のアーム本体内部の forwhileloop は、html! のトップレベル位置と同じ規則に従いますが、一つだけ例外があります:ループ本体が完全に Rust として解析可能な場合(内部のどこにも html 要素がない場合)、マクロはそのループを html の制御フローではなく Rust の文として扱います。

もっとも遭遇しやすいのは、ループ本体に裸の {expr} ブロックしか書かれていないケースです:

// コンパイル可能。for はトップレベルにあり、html-`for` として解析されます。
html! {
for _ in 0..9 {
{my_foo}
}
}

// コンパイル不可。for は `if` の内部にあり、Rust の文として解析されます。
// その後 rustc が、ループ本体の戻り型が `()` ではないと報告します。
html! {
if condition {
for _ in 0..9 {
{my_foo}
}
}
}

子要素を html 要素で囲めば html-for の挙動が保たれます:

html! {
if condition {
for _ in 0..9 {
<span>{my_foo}</span>
}
}
}

回避策の全体像はリストを参照してください。