#leptos #hotkeys #keyboard-shortcuts

leptos_hotkeys

一个用于Leptos应用程序声明式地将键绑定与回调配对的库

10个版本

0.2.2 2024年7月4日
0.2.1 2024年5月27日
0.2.0-alpha.12024年3月21日
0.1.5 2024年2月27日

#88WebAssembly

Download history 110/week @ 2024-04-26 38/week @ 2024-05-03 138/week @ 2024-05-10 9/week @ 2024-05-17 187/week @ 2024-05-24 88/week @ 2024-05-31 48/week @ 2024-06-07 21/week @ 2024-06-14 46/week @ 2024-06-21 77/week @ 2024-06-28 82/week @ 2024-07-05 12/week @ 2024-07-12 24/week @ 2024-07-19 61/week @ 2024-07-26 18/week @ 2024-08-02 20/week @ 2024-08-09

123 每月下载量

MIT 许可证

34KB
633

leptos-hotkeys

All Contributors

声明式创建和配对Leptos应用程序的键绑定与回调。

Crates.io discord

A person playing a burning piano at a sandy beach under a cloudy sky

Leptos-hotkeys创建和管理键盘快捷键。它提供了宏和函数,简化了键绑定的定义,因为与键盘交互相关的事件生命周期管理已经为您完成!

实时示例

想看看它是如何工作的吗? 查看演示

要开始使用,请参考快速入门部分。

功能

[!NOTE] 此crate有三种类型的快捷键:全局、范围和焦点捕获。

use_hotkeys!

使用此宏来声明全局和范围快捷键。此宏保留了Leptos标准,同时具有js语法的特性。 关于宏的更多信息。

全局快捷键

此示例创建了两个全局快捷键: WF

use leptos_hotkeys::use_hotkeys;

#[component]
pub fn SomeComponent() -> impl IntoView {
    let (count, set_count) = create_signal(0);

    // creating a global scope for the W key
    use_hotkeys!(("keyw") => move |_| {
        logging::log!("w has been pressed");
        set_count.update(|c| *c += 1);
    });

    // this is also a global scope for the F key!
    use_hotkeys!(("keyf", "*") => move |_| {
        logging::log!("f has been pressed");
        set_count.update(|c| *c -= 1);
    });

    view! { <p>Num Respects: {count}</p> }
}

[!TIP] 如何编写某些键?请参阅键语法

[!NOTE] * 符号是全局范围的保留字。

W 快捷键省略了范围参数,隐式地使其成为全局的。

范围快捷键

范围提供了快捷键背后的上下文。此上下文可以链接到组件、状态或逻辑。

此示例显示了内部和外部范围以及切换范围的快捷键。

use leptos_hotkeys::{use_hotkeys, use_hotkeys_context, HotkeysContext};

#[component]
pub fn SomeComponent() -> impl IntoView {

    let HotkeysContext { enable_scope, disable_scope, .. } = use_hotkeys_context();

    // switch into the inner scope
    use_hotkeys!(("keyi", "outer") => move |_| {
        disable_scope("outer");
        enable_scope("inner");
    });

    // switch into the outer scope
    use_hotkeys!(("keyo", "inner") => move |_| {
        disable_scope("inner");
        enable_scope("outer");
    });

    view! {
        <div id="outer">
            // outer logic residing...
            <div id="inner">
            // inner logic
            </div>
        </div>
    }
}

[!NOTE] 范围不区分大小写。这意味着 my_scopemY_sCoPe 被认为是相同的范围。

焦点捕获快捷键(use_hotkeys_ref! 宏)

此示例将快捷键嵌入到 <p> 标签中。只有当元素获得焦点且范围正确时,此快捷键才会触发。

use leptos_hotkeys::use_hotkeys_ref;

#[component]
pub fn SomeComponent() -> impl IntoView {

    let p_ref = use_hotkeys_ref!(("keyk", "*") => move |_| {
        // some logic
    });

    view! {
        <p tabIndex=-1 _ref=p_ref>
            p tag with node ref
        </p>
    }
}

快速入门

安装

cargo add leptos_hotkeys

我们还提供其他功能标志,可增强开发人员体验,请参阅功能

provide_hotkeys_context()

App() 组件中调用 provide_hotkeys_context()。这将为当前反应节点及其所有后代提供 HotkeysContext。此函数接受三个参数,即 node_ref、一个禁用模糊事件的标志和一个 initially_active_scopes 列表。 provide_hotkeys_context() 返回一个 HotkeyContext。要管理快捷键,您可以从 HotkeysContext 中提取必要的信号。

use leptos_hotkeys::{provide_hotkeys_context, HotkeysContext, scopes};

#[component]
pub fn App() -> impl IntoView {
    provide_meta_context();

    let main_ref = create_node_ref::<html::Main>();
    let HotkeysContext { .. } = provide_hotkeys_context(main_ref, false, scopes!());

    view! {
        <Router>
            <main _ref=main_ref>  // <-- attach main ref here!
                <Routes>
                    <Route path="/" view=HomePage/>
                    <Route path="/:else" view=ErrorPage/>
                </Routes>
            </main>
        </Router>
    }
}

[!注意] 如果您正在使用 作用域,您可以使用特定的作用域进行初始化。

就是这样!您可以创建全局、作用域和焦点捕获的快捷键!

键绑定语法

leptos_hotkeys 匹配来自 KeyboardEvent 的 code 属性 的代码值。为了参考,以下是一个 所有键盘事件代码值列表

您可以将多个快捷键绑定到回调函数。例如

"KeyG+KeyR,MetaLeft+KeyO,ControlLeft+keyK"

键是大小写不敏感和空白不敏感的。对于具有多个键的快捷键,请使用 , 作为键序列的分隔符。

作用域!()

也许您想在加载时初始化某个作用域,这就是 initially_active_scopes 属性发挥作用的地方。您不需要创建一个 vec!["scope_name".to_string()],而是使用 scopes!() 宏。

use leptos_hotkeys::{provide_hotkeys_context, scopes};

#[component]
pub fn App() -> impl IntoView {
    let main_ref = create_node_ref::<html::Main>();
    provide_hotkeys_context(main_ref, false, scopes!("scope_a", "settings_scope"));

    view! {
        <Router>
            <main _ref=main_ref>
                <Routes>
                    // ... routes
                </Routes>
            </main>
        </Router>
    }
}

debug 特性标志

通过引入 debug 标志来改善开发者体验,该标志在 CSR 中将日志添加到您的控制台。它记录当前按下的键的 code 值、快捷键触发和作用域切换。

简单来说

leptos_hotkeys = { path = "0.2.1", features = ["debug"] }

贡献者

Álvaro Mondéjar
Álvaro Mondéjar

💻
Robert Junkins
Robert Junkins

💻
LeoniePhiline
LeoniePhiline

📖
Gábor Szabó
Gábor Szabó

📖
Phillip Baird
Phillip Baird

🐛
zakstucke
zakstucke

🐛 💻

依赖项

~20–32MB
~513K SLoC