2 个不稳定版本
0.2.0 | 2021 年 6 月 25 日 |
---|---|
0.1.0 | 2021 年 6 月 24 日 |
#568 在 WebAssembly 中
73KB
1.5K SLoC
Consecuit
一个 实验性 的函数式 Web UI 框架,它使用 Rust 类型系统进行挂钩和更多。
这与其他框架有何不同?
其他函数式 UI 框架:
-
要求开发人员遵循 Hooks 规则 或类似规则。
-
通过计算组件/挂钩被调用的顺序动态识别组件/挂钩并维护它们的状态。
-
动态设计
- 组件在父组件渲染时动态创建和挂载。
- 组件可以根据状态进行挂载或卸载。
Consecuit:
-
使用 Rust 类型系统自动强制执行 Hooks 规则。
-
静态地知道将要创建的每个组件和将要发生的每个挂钩调用。
-
静态优先设计
- 组件在应用开始时静态挂载,并默认永久挂载。
- 根据状态进行挂载/卸载被视为可以通过显式使用
opt_comp
、vec_comps
等提供的特殊案例。
它看起来像什么?
如果您想要更简单一些,这里是计数器的代码。
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 书籍。
-
初始化一个新的 lib crate。
cargo new --lib YOUR_CRATE_NAME_HERE cd YOUR_CRATE_NAME_HERE
-
将此添加到您的
Cargo.toml
[lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2.74" consecuit = "0.2.0" consecuit_html = "0.2.0"
-
在项目的根目录中创建一个
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 名称。) -
安装
wasm-pack
cargo install wasm-pack
-
编写您的代码。
您可以复制粘贴上面的计数器示例。
-
构建它!
wasm-pack build --dev --target web
-
提供服务!
# Install a simple web server. cargo install microserver # And run it! microserver
最终代码在examples/minimal_counter。
文档中提供了更多关于创建组件和钩子的信息。
接下来是什么?
这个库还处于早期阶段。许多功能尚未实现。(例如,目前不支持内联样式;您需要使用类名并编写CSS。)
欢迎贡献!
此crate使用unsafe。
所有公开的函数都是安全的。
依赖项
~11MB
~221K SLoC