#ui #html-macro #dom #react #ui-framework #experience #gui

dioxus-html

Dioxus 的 HTML 元素包 - 用于交互式用户体验的并发渲染无关的虚拟 DOM

21 个版本

0.6.0-alpha.22024 年 8 月 7 日
0.5.6 2024 年 7 月 18 日
0.5.0 2024 年 3 月 28 日
0.4.3 2023 年 12 月 7 日
0.1.1 2021 年 12 月 29 日

#258Web 编程

Download history 4941/week @ 2024-05-01 4547/week @ 2024-05-08 4825/week @ 2024-05-15 4606/week @ 2024-05-22 4886/week @ 2024-05-29 4517/week @ 2024-06-05 4451/week @ 2024-06-12 4710/week @ 2024-06-19 4146/week @ 2024-06-26 2264/week @ 2024-07-03 3070/week @ 2024-07-10 3874/week @ 2024-07-17 3596/week @ 2024-07-24 3826/week @ 2024-07-31 3666/week @ 2024-08-07 3384/week @ 2024-08-14

15,091 每月下载量
用于 68 个包(直接使用 15 个)

MIT/Apache

1MB
20K SLoC

dioxus-html: Dioxus 的 Html(和 SVG)命名空间

Crates.io MIT licensed Build Status Discord chat

网站 | 指南 | API 文档 | 聊天

概述

Dioxus 的 rsx!html! 宏可以在 NodeFactory 的基础上接受任何编译时正确的命名空间。这个 crate 提供了 HTML(和 SVG)命名空间,这些命名空间在 Dioxus 预导入中导入。

然而,这种抽象使您能够在调用 rsx! 时添加任何命名空间,只要它们在作用域内。例如,为增强现实设计的 UI 可能会使用与 HTML 不同的基本元素。

use ar_namespace::*;

rsx! {
    magic_div {
        magic_header {}
        magic_paragraph {
            on_magic_click: move |event| {
                //
            }
        }
    }
}

这目前是 Dioxus 中不太被探索的部分。然而,命名空间系统确实使提供语法高亮、文档、“转到定义”和编译时正确性成为可能,因此抽象化它是值得的。

它的工作原理

用于 dioxus 的元素必须实现(简单的)DioxusElement 特性,才能在 rsx! 宏中使用。

struct div;
impl DioxusElement for div {
    const TAG_NAME: &'static str = "div";
    const NAME_SPACE: Option<&'static str> = None;
}

所有元素都应该定义为零大小的结构体(也称为单元结构体)。这些结构体是零成本的,只为 Rust 提供类型级别的技巧,以实现编译时正确的模板。

属性随后在这些单元结构体上作为常量实现。

HTML 命名空间主要使用宏定义。然而,展开形式可能看起来像这样

struct base;
impl DioxusElement for base {
    const TAG_NAME: &'static str = "base";
    const NAME_SPACE: Option<&'static str> = None;
}
impl base {
    const href: (&'static str, Option<'static str>, bool) = ("href", None, false);
    const target: (&'static str, Option<'static str>, bool) = ("target", None, false);
}

因为属性是在单元结构体上定义为方法的,所以它们在编译时正确的接口后面保护了属性创建。

如何扩展它

每当调用 rsx! 宏时,它都依赖于作用域内的模块 dioxus_elements。当您在 dioxus 中启用 html 功能时,此模块会导入到预导入中。但是,您可以通过创建自己的 dioxus_elements 模块并重新导出 html 命名空间来扩展此内容。

mod dioxus_elements {
    use dioxus::prelude::dioxus_elements::*;
    struct my_element;
    impl DioxusElement for my_element {
        const TAG_NAME: &'static str = "base";
        const NAME_SPACE: Option<&'static str> = None;
    }
}

贡献

许可证

本项目采用MIT许可证

除非您明确声明,否则您有意提交给Dioxus的任何贡献均应作为MIT许可证,不附加任何其他条款或条件。

依赖项

~5–14MB
~170K SLoC