Rust高效Hooks库leptos-use的使用,Leptos框架下的实用工具集助力前端开发

Rust高效Hooks库leptos-use的使用,Leptos框架下的实用工具集助力前端开发

Leptos-Use Logo

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>
    }
}

注意事项

  1. leptos-use需要与Leptos框架配合使用
  2. 大多数Hooks都会自动清理资源,无需手动处理
  3. 注意响应式数据的生命周期管理
  4. 查看官方文档获取完整的Hooks列表和详细用法

leptos-use通过提供这些实用Hooks,可以大幅提升Leptos应用开发效率和代码可维护性。

回到顶部