Skip to main content
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>,
}
};

单元素 arm 可以省略大括号。含多个子节点或 let 绑定的 arm 需要大括号。

match 支持所有标准 Rust 模式,包括 OR 模式(A | B)、解构和 if 守卫。穷尽性由 Rust 编译器检查。

if / match 体内部的循环

if / else if / else / match 分支体内部的 forwhileloophtml! 顶层位置的规则相同,但有一个例外:如果循环体可以被 Rust 完整解析(内部任何位置都没有 html 元素),宏会把这个循环视为 Rust 语句而不是 html 控制流。

最常见的触发情形是循环体里只有一个裸 {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>
}
}
}

完整的解决方案集合请参见列表