#ui-framework #functional #web-ui #gui #web-gui

consecuit

一个使用类型系统进行挂钩和更多功能的函数式 Web UI 框架

2 个不稳定版本

0.2.0 2021 年 6 月 25 日
0.1.0 2021 年 6 月 24 日

#568WebAssembly


用于 consecuit_html

LGPL-2.1

73KB
1.5K SLoC

Consecuit

crates.io crates.io

一个 实验性 的函数式 Web UI 框架,它使用 Rust 类型系统进行挂钩和更多。

这与其他框架有何不同?

其他函数式 UI 框架:

  • 要求开发人员遵循 Hooks 规则 或类似规则。

  • 通过计算组件/挂钩被调用的顺序动态识别组件/挂钩并维护它们的状态。

  • 动态设计

    • 组件在父组件渲染时动态创建和挂载。
    • 组件可以根据状态进行挂载或卸载。

Consecuit:

  • 使用 Rust 类型系统自动强制执行 Hooks 规则。

  • 静态地知道将要创建的每个组件和将要发生的每个挂钩调用。

  • 静态优先设计

    • 组件在应用开始时静态挂载,并默认永久挂载。
    • 根据状态进行挂载/卸载被视为可以通过显式使用 opt_compvec_comps 等提供的特殊案例。

它看起来像什么?

请查看我们的 TodoMVC(并查看其 源代码)。

如果您想要更简单一些,这里是计数器的代码。

use consecuit::prelude::*;
use consecuit_html::prelude::*;
use wasm_bindgen::prelude::*;

#[wasm_bindgen(start)]
pub fn run() -> Result<(), JsValue> {
    consecuit::mount::mount_app(counter);
    Ok(())
}

fn counter(cc: ComponentBuilder, _: ()) -> impl ComponentReturn {
    let (cc, (count, setter)) = cc.hook(use_state, 0);

	let setter1 = setter.clone();
    let decrement = Callback::new(move |_ev| {
        setter1.update_with(|v| v - 1);
    });

    let increment = Callback::new(move |_ev| {
        setter.update_with(|v| v + 1);
    });
    
    cc_tree!(
		<button {html_props().onclick(decrement)}>"-"</button>
		{count.to_string()}
		<button {html_props().onclick(increment)}>"+"</button>
    )
}

更多计数器示例 在此处(包括带有实时演示的 此处),包括一个没有宏和一个将逻辑提取到 use_counter 函数中的示例。

如何开始?

按照下面的简单指南进行

点击展开指南

注意:此指南是为了让您尽快开始。指南中的 WASM 设置部分非常基础。您应该在以后阅读 rustwasm 书籍

  1. 初始化一个新的 lib crate。

    cargo new --lib YOUR_CRATE_NAME_HERE
    cd YOUR_CRATE_NAME_HERE
    
  2. 将此添加到您的 Cargo.toml

    [lib]
    crate-type = ["cdylib"]
    
    [dependencies]
    wasm-bindgen = "0.2.74"
    consecuit = "0.2.0"
    consecuit_html = "0.2.0"
    
  3. 在项目的根目录中创建一个 index.html,内容如下。

    <html>
    <head>
        <meta content="text/html;charset=utf-8" http-equiv="Content-Type" />
    </head>
    <body>
        <script type="module">
            import init from './pkg/YOUR_CRATE_NAME_HERE.js';
            init();
        </script>
    </body>
    </html>
    

    (将 YOUR_CRATE_NAME_HERE 替换为您的 crate 名称。)

  4. 安装 wasm-pack

    cargo install wasm-pack
    
  5. 编写您的代码。

    您可以复制粘贴上面的计数器示例

    还可以查看示例目录文档

  6. 构建它!

    wasm-pack build --dev --target web
    
  7. 提供服务!

    # Install a simple web server.
    cargo install microserver
    # And run it!
    microserver
    

最终代码在examples/minimal_counter

文档中提供了更多关于创建组件和钩子的信息。

接下来是什么?

这个库还处于早期阶段。许多功能尚未实现。(例如,目前不支持内联样式;您需要使用类名并编写CSS。)

欢迎贡献!

此crate使用unsafe。

所有公开的函数都是安全的。

依赖项

~11MB
~221K SLoC