如何开发一个基于rust语言的leptos框架小而美的Todo应用

659 阅读3分钟

leptos框架的优势

Leptos 是一个基于 Rust 的全栈 Web 框架,用细粒度的响应式系统来构建声明式用户界面:

  1. 高性能:Leptos 使用细粒度的响应式系统,避免了传统虚拟 DOM 的对比操作,从而实现更高效的 UI 更新,提高了性能表现。
  2. 全栈同构:Leptos 可以在客户端和服务器端使用同一套代码进行开发,提供同构服务器函数,这样前后端交互变得更加简单,开发效率也提高了,代码复用也更方便。
  3. 多种渲染模式:Leptos 支持客户端渲染(CSR)和服务器端渲染(SSR),并且具有 HTML 流式传输和 Suspense 组件等特性,适合用来构建现代 Web 应用。
  4. 声明式 UI 构建:通过类似 JSX 的模板语法,Leptos 让开发者可以用声明式的方式来创建用户界面,这大大简化了开发过程。
  5. 类型安全和内存安全:因为 Leptos 基于 Rust 开发,所以它继承了 Rust 语言的类型安全和内存安全特性,减少了运行时的错误。

最近持续一周leptos框架刷新GithubTrending榜第一名,让我们了解一下这个框架是个什么鬼,怎么用。

环境设置

首先,我们需要设置开发环境:

  1. 安装Rust:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
  2. 安装Trunk(Wasm应用打包工具):

    cargo install trunk
    
  3. 创建新项目:

    cargo new leptos-todo-app
    cd leptos-todo-app
    
  4. 添加Leptos依赖:

    cargo add leptos --features=csr,nightly
    
  5. 切换到nightly版本Rust:

    rustup toolchain install nightly
    rustup override set nightly
    

项目结构

创建以下文件结构:

.
├── Cargo.toml
├── index.html
└── src
    └── main.rs

编写代码

现在,让我们开始编写一个简单的待办事项应用。

src/main.rs中添加以下代码:

use leptos::*;

#[component]
fn App() -> impl IntoView {
    let (todos, set_todos) = create_signal(vec![]);

    view! {
        <div class="todo-app">
            <h1>"待办事项应用"</h1>
            <TodoInput set_todos={set_todos} />
            <TodoList todos={todos} set_todos={set_todos} />
        </div>
    }
}

#[component]
fn TodoInput(set_todos: WriteSignal<Vec<String>>) -> impl IntoView {
    let (new_todo, set_new_todo) = create_signal(String::new());

    let add_todo = move |_| {
        set_todos.update(|todos| todos.push(new_todo.get()));
        set_new_todo.set(String::new());
    };

    view! {
        <div>
            <input
                type="text"
                on:input=move |ev| set_new_todo.set(event_target_value(&ev))
                prop:value=new_todo
            />
            <button on:click=add_todo>"添加"</button>
        </div>
    }
}

#[component]
fn TodoList(
    todos: ReadSignal<Vec<String>>,
    set_todos: WriteSignal<Vec<String>>
) -> impl IntoView {
    let remove_todo = move |index: usize| {
        set_todos.update(|todos| { todos.remove(index); });
    };

    view! {
        <ul>
            <For
                each=move || todos.get()
                key=|todo| todo.clone()
                children=move |todo| {
                    view! {
                        <li>
                            {todo}
                            <button on:click=move |_| remove_todo(todos.get().iter().position(|t| t == &todo).unwrap())>
                                "删除"
                            </button>
                        </li>
                    }
                }
            />
        </ul>
    }
}

fn main() {
    mount_to_body(App);
}

运行应用

  1. 创建index.html文件:
<!DOCTYPE html>
<html>
  <head>
    <title>Leptos待办事项应用</title>
  </head>
  <body></body>
</html>
  1. 使用Trunk运行应用:
trunk serve
  1. 在浏览器中访问http://localhost:8080查看应用。

这个简单的教程展示了如何使用Leptos框架创建一个基本的待办事项应用。它包括添加新待办事项、显示待办事项列表以及删除待办事项的功能。Leptos的反应式编程模型使得创建交互式UI变得简单高效。

随着您对Leptos的深入了解,您可以进一步探索其他高级特性,如服务器端渲染(SSR)、同构服务器函数等,以构建更复杂和强大的web应用程序。