请注意:该框架正在积极开发中。目前,我将其保持在 0.0.x 版本的循环中,以表明它甚至还没有为 0.1.0 做好准备。正在对文档和功能进行积极的工作,API 不一定被认为是稳定的。同时,它不仅仅是一个玩具项目或概念验证,我正在积极将其用于我自己的应用程序开发。
use leptos::*;
#[component]
pub fn SimpleCounter(cx: Scope, initial_value: i32) -> Element {
// create a reactive signal with the initial value
let (value, set_value) = create_signal(cx, initial_value);
// create event handlers for our buttons
// note that `value` and `set_value` are `Copy`, so it's super easy to move them into closures
let clear = move |_| set_value(0);
let decrement = move |_| set_value.update(|value| *value -= 1);
let increment = move |_| set_value.update(|value| *value += 1);
// this JSX is compiled to an HTML template string for performance
view! {
cx,
<div>
<button on:click=clear>"Clear"</button>
<button on:click=decrement>"-1"</button>
<span>"Value: " {move || value().to_string()} "!"</span>
<button on:click=increment>"+1"</button>
</div>
}
}
// Easy to use with Trunk (trunkrs.dev) or with a simple wasm-bindgen setup
pub fn main() {
mount_to_body(|cx| view! { cx, <SimpleCounter initial_value=3 /> })
}
Leptos 是一个全栈、同构的 Rust Web 框架,利用细粒度的 React 性来构建声明式用户界面。
Resource
<Suspense/>
以下是一些了解有关乐浦的更多信息的资源:
nightly注意
大多数示例都假设你正在使用 Rust。如果你处于稳定状态,请注意以下事项:
nightly
"stable"
Cargo.toml
leptos = { version = "0.0", features = ["stable"] }
nightly启用用于访问和设置信号的函数调用语法。如果使用 ,则只需调用 、 或手动操作。查看
计数器稳定示例
,了解正确 API 的示例。stable
.get()
.set()
.update()
我创建了一个基准测试,将Leptos在服务器上的HTML渲染与Tera,Yew和Sycamore进行了比较。你可以在此处找到基准测试,并使用 .Leptos 渲染 HTML 的速度大致与 Tera 一样快,并且随着模板变大而扩展良好。它比类似框架完成的服务器端HTML渲染要快得多。
cargo bench
ns/iter | 泰拉 | 乐浦 | 紫杉 | 悬铃木 |
3 计数器 | 3,454 | 5,666 | 34,984 | 32,412 |
TodoMVC (no todos) | 2,396 | 5,561 | 38,725 | 68,749 |
TodoMVC (1000 todos) | 3,829,447 | 3,077,907 | 5,125,639 | 19,448,900 |
平均 | 1.08 | 1.65 | 6.25 | 9.36 |
测试前端 Web 框架原始渲染性能的黄金标准是 js-framework-benchmark。官方结果将Leptos列为最快的Rust / Wasm框架,比SolidJS略慢,比流行的JS框架(如Svelte,Preact和React)快得多。
确定!显然,宏用于生成 DOM 节点,但你可以使用响应式系统来驱动任何使用与 DOM 相同类型的面向对象、基于事件回调的框架的 GUI 工具包。原理是相同的:
view
我整理了一个非常简单的 GTK 示例,以便你了解我的意思。
从表面上看,这些库可能看起来很相似。当然,Yew 是用于 Web UI 开发的最成熟的 Rust 库,并且拥有庞大的生态系统。Dioxus 在很多方面都很相似,都深受 React 的启发。以下是乐浦和这些框架之间的一些概念差异:
从概念上讲,这两个框架非常相似:因为两者都建立在细粒度的 React 性之上,所以大多数应用程序最终在两者之间看起来非常相似,Sycamore或Leptos应用程序看起来都很像SolidJS应用程序,就像Yew或Dioxus看起来很像React一样。
有一些实际差异会产生显着差异:
view
view
<template>
document.createElement()
create_rw_signal 来提供统一的读/写信号。
let (count, set_count) = create_signal(cx, 0);
count()
count.get()
let (count, set_count) = create_signal(cx, 0); // a signal
let double_count = move || count() * 2; // a derived signal
let memoized_count = create_memo(cx, move |_| count() * 3); // a memo
// all are accessed by calling them
assert_eq!(count(), 0);
assert_eq!(double_count(), 0);
assert_eq!(memoized_count(), 0);
// this function can accept any of those signals
fn do_work_on_signal(my_signal: impl Fn() -> i32) { ... }
“静态的”:
Leptos 和 Sycamore 都减轻了闭包(特别是事件侦听器)中移动信号的痛苦,以避免 Rust UI 代码中非常熟悉的。Sycamore 通过使用凹凸分配将其信号的生命周期与其作用域联系起来来实现这一点:由于引用是 ,可以移动到闭包中。Leptos 通过使用竞技场分配和传递索引来实现这一点:像 、 这样的类型实际上是将索引包装到竞技场中。这意味着示波器和信号都在乐浦中,这意味着它们可以很容易地移动到闭包中,而不会增加生命周期的复杂性。Copy
{ let count = count.clone(); move |_| ... }
Copy
&'a Signal<T>
ReadSignal<T>
WriteSignal<T>
Memo<T>
Copy
'static