返回顶部
d

dioxus-frameworkDioxus框架

Dioxus 是一个 Rust 的全栈跨平台应用框架,支持服务端渲染、实时更新和类似 React 的组件模型。当用户需要使用 Dioxus 构建 Web 应用、创建组件、处理状态、路由、或处理数据获取时使用。

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.0
安全检测
已通过
454
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

dioxus-framework

Dioxus Framework

Dioxus 是一个现代 Rust Web 框架,结合了 React 的编程模型与 Rust 的性能优势。它允许你构建高性能的 Web 应用,支持服务端渲染(SSR)、实时更新和跨平台部署。

快速开始

安装依赖

bash

在 Rust 项目中添加 Dioxus


cargo add dioxus --features ssr

使用 CLI 工具

cargo install dioxus-cli

基本项目结构

src/
├── main.rs # 应用入口
├── App.rsx # 根组件
├── components/ # 子组件目录
├── routes/ # 路由模块
├── server_fn/ # 服务端函数
└── utils/ # 工具函数

组件基础

定义组件

组件是使用 #[component] 宏定义的函数,它接受 Properties(props)并返回一个 Element。

rust
use dioxus::prelude::*;

#[component]
fn DogApp(breed: String) -> Element {
rsx! {
div { class: card } {
h2 { Dogs of breed: {breed} }
ul {
(0..3).map(|i| rsx! {
li { Dog {i} }
})
}
}
}
}

Component Properties

所有组件都接受一个描述其参数的 struct。Props 需要 derive 以下 traits:

rust
#[derive(Props, PartialEq, Clone)]
struct DogAppProps {
breed: String,
}

重要特性:

特性说明
Props组件接受的参数对象
PartialEqual
允许部分更新 props |
| Clone | 允许克隆 props |
| Memoized | 默认 memoized,只有 props 改变时重新渲染 |

组件生命周期

Dioxus 组件会在以下情况下重新渲染:

  1. 1. Props 改变:当组件的 props 发生变化时
  2. 信号变化:当组件监听的信号更新时
  3. Scope.needs_update():当父组件要求更新时

重要: Dioxus 默认 memoized 所有组件,性能比 React 更好。

状态管理

使用 Hooks

Dioxus 提供类似 React 的 hooks 用于管理状态。

use_signal()

创建响应式状态:

rust
#[component]
fn Counter() -> Element {
let mut count = use_signal(cx, || 0);

rsx! {
div {
button {
onclick: move |_| {
count += 1;
}
} { Increment }
p { Count: {count} }
button {
onclick: move |_| {
count -= 1;
}
} { Decrement }
}
}
}

use_coroutine()

运行异步操作:

rust
#[component]
fn DataFetcher() -> Element {
let mut data = use_signal(cx, || None::);
let loading = use_signal(cx, || false);

use_coroutine(cx, |cx| async move {
loading.set(true);
// 模拟异步数据获取
tokio::time::sleep(Duration::from_secs(2)).await;
data.set(Some(Fetched data.to_string()));
loading.set(false);
});

rsx! {
div {
if *loading.get() {
p { Loading... }
} else if let Some(d) = data.get() {
p { Data: {d} }
} else {
p { No data yet }
}
}
}
}

use_context()

访问上下文值:

rust
#[derive(Clone, Props)]
struct ChildProps {
value: String,
}

#[component]
fn Child(props: ChildProps) -> Element {
rsx! { p { Value from context: {props.value} } }
}

#[component]
fn Parent() -> Element {
let value = usecontext(cx, || default.tostring());
rsx! { Child { value: value.clone() } }
}

全局状态

使用信号进行全局状态管理:

rust
// main.rs
use dioxus::prelude::*;

fn main() {
let themesignal = RwSignal::new(light.tostring());
dioxus::launch(App, (
AppContext::new(theme_signal)
));
}

// App.rsx
#[component]
fn App() -> Element {
let theme = use_context(cx);
rsx! {
div {
button {
onclick: move || theme.set(dark.tostring())
} { Dark Mode }
button {
onclick: move || theme.set(light.tostring())
} { Light Mode }
p { Current theme: {theme.read()} }
}
}
}

路由

基本路由

rust
// routes/mod.rs
use dioxus::prelude::*;
use dioxus::router::{Route, Router};

#[component]
fn Home() -> Element {
rsx! { h1 { Home Page } }
}

#[component]
fn About() -> Element {
rsx! { h1 { About Page } }
}

// App.rsx
#[component]
fn App() -> Element {
rsx! {
Router {
Route { to: /, Home {} }
Route { to: /about, About {} }
}
}
}

动态路由

rust
use dioxus::router::NavLink;

rsx! {
nav {
ul {
li { NavLink { to: / } { Home } }
li { NavLink { to: /about } { About } }
}
}
}

表单处理

rust
#[derive(Props, Clone)]
struct FormProps {
on_submit: Callback,
}

#[component]
fn Form(props: FormProps) -> Element {
let mut name = use_signal(cx, || String::new());
let mut email = use_signal(cx, || String::new());

rsx! {
form {
onsubmit: move |event| {
event.prevent_default();
props.on_submit.call((
name.get().clone(),
email.get().clone(),
));
}
} {
input {
r#type: text,
value: {name},
oninput: move |e| name.set(e.value())
}
input {
r#type: email,
value: {email},
oninput: move |e| email.set(e.value())
}
button { r#type: submit } { Submit }
}
}
}

服务端渲染(SSR)

启用 SSR

rust
// main.rs
use dioxus::prelude::*;

fn main() {
// 启用 SSR 功能
dioxus::launch(App);
}

// server_fn/api.rs
use dioxus::prelude::*;

#[server_fn(/)]
async fn serve_home() -> String {
// 渲染组件为字符串
rendertostring(|cx| rsx! { App {} })
}

服务端函数(Server Functions)

rust
use dioxus::prelude::*;

#[server_fn(/api/hello)]
async fn hello(name: String) -> String {
format!(Hello, {}!, name)
}

数据获取

使用资源

rust
#[server_fn(/api/data)]
async fn fetch_data() -> Json> {
use crate::data::fetchfromdb().await
}

常见模式

条件渲染

rust
rsx! {
div {
if *count.get() > 0 {
p { Count is positive }
} else {
p { Count is zero }
}
}
}

列表渲染

rust
let items = vec![Item 1, Item 2, Item 3];

rsx! {
ul {
items.iter().map(|item| rsx! {
li { key: {item} } { item }
})
}
}

组件组合

rust
#[component]
fn Header() -> Element {
rsx! {
header {
h1 { My App }
nav {
a { href: / } { Home }
a { href: /about } { About }
}
}
}
}

#[component]
fn PageLayout(content: Element) -> Element {
rsx! {
div { class: layout } {
Header {}
main { content }
Footer {}
}
}
}

样式和资源

CSS 模块

rust
// 在 main.rs 或

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 dioxus-framework-1776318025 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 dioxus-framework-1776318025 技能

通过命令行安装

skillhub install dioxus-framework-1776318025

下载

⬇ 下载 dioxus-framework v1.0.0(免费)

文件大小: 10.79 KB | 发布时间: 2026-4-16 18:44

v1.0.0 最新 2026-4-16 18:44
Initial release: comprehensive Dioxus Rust framework skill covering components, state management, routing, SSR, and deployment

Archiver·手机版·闲社网·闲社论坛·智能体自动化市场· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2026 闲社网·AI智能体论坛·AI自动化解决方案·http://xianshe.com

p2p_official_large
返回顶部