Rust高效Hooks库leptos-use的使用,Leptos框架下的实用工具集助力前端开发
Rust高效Hooks库leptos-use的使用,Leptos框架下的实用工具集助力前端开发
Leptos-Use是一个为Leptos框架设计的实用工具集,灵感来源于React-Use和VueUse。它提供了88个实用的函数,支持服务器端渲染(SSR),可以帮助开发者更高效地构建前端应用。
使用示例
以下是一个使用use_mouse
钩子的基本示例:
use leptos::prelude::*;
use leptos_use::{use_mouse, UseMouseReturn};
#[component]
fn Demo() -> impl IntoView {
let UseMouseReturn { x, y, .. } = use_mouse();
view! { cx,
{x} " x " {y}
}
}
完整示例
下面是一个更完整的示例,展示了如何使用leptos-use中的多个钩子:
use leptos::*;
use leptos_use::{use_mouse, use_window_size, use_interval_fn, UseMouseReturn, UseWindowSizeReturn};
#[component]
pub fn App() -> impl IntoView {
// 使用鼠标位置钩子
let UseMouseReturn { x, y, .. } = use_mouse();
// 使用窗口尺寸钩子
let UseWindowSizeReturn { width, height } = use_window_size();
// 计数器状态
let (count, set_count) = create_signal(0);
// 使用间隔函数
use_interval_fn(
move || {
set_count.update(|c| *c += 1);
},
1000, // 每1000毫秒执行一次
);
view! { cx,
<div>
<h1>"Leptos-Use Demo"</h1>
<div>
<h2>"Mouse Position"</h2>
<p>{x} " x " {y}</p>
</div>
<div>
<h2>"Window Size"</h2>
<p>{width} " x " {height}</p>
</div>
<div>
<h2>"Counter"</h2>
<p>{count}</p>
</div>
</div>
}
}
安装
在项目中添加leptos-use依赖:
leptos-use = "0.16.2"
或者运行:
cargo add leptos-use
特性
- 88个实用函数
- 支持服务器端渲染(SSR)
- 与Leptos框架完美集成
- 灵感来源于React-Use/VueUse
- MIT/Apache 2.0双许可证
Leptos兼容性
Crate版本 | 兼容的Leptos版本 |
---|---|
<= 0.3 | 0.3 |
0.4-0.6 | 0.4 |
0.7-0.9 | 0.5 |
0.10-0.13 | 0.6 |
0.14-0.15 | 0.7 |
0.16 | 0.8 |
如果你发现缺少某些功能,欢迎提交issue或PR!
1 回复
Rust高效Hooks库leptos-use的使用指南
leptos-use是一个为Leptos框架设计的高效Hooks工具集,它提供了一系列实用的React式钩子函数,可以显著简化前端开发工作。
主要特性
- 专为Leptos框架优化
- 提供类似React Hooks的开发体验
- 包含大量实用的前端功能Hooks
- 类型安全且高效
安装方法
在Cargo.toml中添加依赖:
[dependencies]
leptos-use = "0.7"
常用Hooks及使用示例
1. use_window
获取窗口尺寸和滚动位置:
use leptos::*;
use leptos_use::use_window;
#[component]
pub fn WindowInfo() -> impl IntoView {
let window = use_window();
view! {
<div>
<p>窗口宽度: {move || window.width()}</p>
<p>窗口高度: {move || window.height()}</p>
</div>
}
}
2. use_local_storage
本地存储操作:
use leptos::*;
use leptos_use::{use_local_storage, UseLocalStorageReturn};
#[component]
pub fn StorageExample() -> impl IntoView {
let UseLocalStorageReturn {
set_value,
value,
remove,
..
} = use_local_storage::<String>("my-key");
let input_value = create_rw_signal("".to_string());
view! {
<div>
<input
type="text"
prop:value=input_value
on:input=move |ev| input_value.set(event_target_value(&ev))
/>
<button on:click=move |_| set_value(input_value.get())>
"保存到本地存储"
</button>
<p>存储的值: {value}</p>
</div>
}
}
3. use_interval
定时器功能:
use leptos::*;
use leptos_use::use_interval;
#[component]
pub fn Timer() -> impl IntoView {
let count = create_rw_signal(0);
use_interval(
move || {
count.update(|c| *c += 1);
},
1000, // 1秒间隔
);
view! {
<div>计数: {count}</div>
}
}
4. use_event_listener
事件监听:
use leptos::*;
use leptos_use::use_event_listener;
use web_sys::KeyboardEvent;
#[component]
pub fn KeyLogger() -> impl IntoView {
let last_key = create_rw_signal(None::<String>);
use_event_listener(
window(),
ev::keydown,
move |event: KeyboardEvent| {
last_key.set(Some(event.key()));
},
);
view! {
<div>
<p>最后按下的键: {move || last_key.get().unwrap_or_default()}</p>
</div>
}
}
5. use_debounce
防抖函数:
use leptos::*;
use leptos_use::{use_debounce_fn, use_debounce};
#[component]
pub fn SearchBox() -> impl IntoView {
let search_query = create_rw_signal("".to_string());
let debounced_query = use_debounce(search_query, 500); // 500ms防抖
view! {
<div>
<input
type="text"
prop:value=search_query
on:input=move |ev| search_query.set(event_target_value(&ev))
placeholder="输入搜索内容..."
/>
<p>实际搜索内容: {debounced_query}</p>
</div>
}
}
高级用法
组合使用多个Hooks
use leptos::*;
use leptos_use::{use_window, use_throttle};
#[component]
pub fn ResponsiveComponent() -> impl IntoView {
let window = use_window();
let throttled_width = use_throttle(move || window.width(), 200); // 200ms节流
view! {
<div class:mobile=move || throttled_width.get() < 768>
{move ||
if throttled_width.get() < 768 {
"移动设备视图"
} else {
"桌面视图"
}
}
</div>
}
}
完整示例代码
下面是一个结合多个leptos-use Hooks的完整示例:
use leptos::*;
use leptos_use::{use_window, use_local_storage, use_interval};
#[component]
pub fn App() -> impl IntoView {
// 使用use_window获取窗口尺寸
let window = use_window();
// 使用use_local_storage存储用户偏好
let storage = use_local_storage::<String>("theme-preference");
// 使用use_interval创建定时器
let counter = create_rw_signal(0);
use_interval(
move || {
counter.update(|c| *c += 1);
},
1000,
);
view! {
<div class="app">
<h1>leptos-use综合示例</h1>
<div class="window-info">
<h2>窗口信息</h2>
<p>宽度: {move || window.width()}</p>
<p>高度: {move || window.height()}</p>
</div>
<div class="storage-example">
<h2>本地存储</h2>
<input
type="text"
prop:value=storage.value
on:input=move |ev| storage.set_value(event_target_value(&ev))
placeholder="输入主题偏好"
/>
<p>当前偏好: {storage.value}</p>
</div>
<div class="timer">
<h2>定时器</h2>
<p>已运行: {counter} 秒</p>
</div>
</div>
}
}
注意事项
- leptos-use需要与Leptos框架配合使用
- 大多数Hooks都会自动清理资源,无需手动处理
- 注意响应式数据的生命周期管理
- 查看官方文档获取完整的Hooks列表和详细用法
leptos-use通过提供这些实用Hooks,可以大幅提升Leptos应用开发效率和代码可维护性。