4个版本 (破坏性)

0.4.0 2023年10月28日
0.3.0 2023年7月17日
0.2.0 2023年7月17日
0.1.0 2023年7月14日

#330 in 过程宏

MIT 协议

78KB
2K SLoC

yew-alt-html

crates.io download docs.rs

Yew中构建Html的备用宏。

示例

此示例表示Yew应用程序的根App组件。它展示了文本节点中的插值、属性中的插值、宏根中的多个节点,以及缩写标签的关闭和使用匹配表达式中的标签。

use yew::prelude::*;
use yew_alt_html::ah;

enum LoadState {
    Loading,
    Failed,
    Loaded,
}

#[function_component]
pub fn App() -> Html {
    let name = "Yew";
    let italic_style = "font-style: italic";

    use LoadState::*;
    let state = Loaded;
    let items = vec![1, 2, 3];
    ah! {
        <h1 style=italic_style>"Hello " name "!"</>
        match state {
            Loading => "Loading...",
            Failed => "Load failed!",
            Loaded => <p>"Welcome to "<code>"yew-alt-html"</>"!"</>,
        }
        <ul>
            for item in items {
                <li>item</>
            }
        </>
    }
}

为什么还需要另一个html!

这个crate在创建一个更容易使用的宏上进行实验。为此,替换了使用起来略显繁琐的html!语法,直接在ah!中使用值。

以下问题应该通过此crate解决

  • 即使值是简单的文字,也需要在标签内使用{}
  • 需要在{}中包装属性(请注意,缩写仍然使用{变量})。
  • 在关闭标签时必须重复泛型(Yew专用)和标签名称(虽然不是非常HTML,但仍然值得考虑)。
  • 在宏根中使用多个节点时,必须使用片段<></>
  • 不能像使用if一样使用match
  • 繁琐的{ for ... }表示法(在0.4.0中修复)。

可能的问题

大多数 html! 语法 应该由 ah! 宏支持。如果您的代码只是将 html! 替换为 ah! 而不能正常工作,请 提交一个问题

一些语法受到限制(例如,在属性中使用 > 而没有 if)。建议的解决方案是将复杂值在 ah! 之前移动到变量中,或者像在 html! 中那样将值包裹在 {} 大括号中。

计划中

  • 支持在 match 情况中直接编写标签(目前需要将标签包裹在 ah! 中),类似于 if(在 0.2.0 中修复)。
  • 底层不使用 html!:添加更多检查(目前由 html! 处理)并手动生成虚拟 DOM。
  • 只要可用,就使用 诊断 API 来修改范围并显示确切的错误范围,而不是使所有内容都变红(在 0.3.0 中部分修复,还需要与范围进行更多未来的工作)。
  • 适当的测试。目前,该软件包的作者在一个广泛的项目上手动测试了该软件包。

没有运行时依赖