Leptos 浅用到现在,没有写过一句 Javascript 代码,完全用 Rust 替代了。
多亏了 crates 提供了调用 BOM API 的功能,像:
- 打印输出可用 console_log
- 提供了大量 BOM 调用的 API gloo
- 目前我用到时间库是 js-sys 提供
画一只赛博猫猫
我用 Leptos 画了一只可爱的小猫,用鼠标点击它会喵喵叫,鼠标按住会发出咕噜声。界面是用 HTML 画的,但用到的逻辑代码,包括事件监听,类似 Javoscript Interval
的时间函数等都是 Rust 写的。
项目地址在:cyber kitten
猫猫摇尾巴的逻辑其实就是用一个 Interval
方法,每半秒换一堆字符渲染,我用数组存放了五幅猫猫不同动作的字符画:
const CAT_SIT: [&'static str; 5] = [
r"
/\____/\
) (
=\ /=
) (
/ \
) (
/ \
\ /
\__ __/
))
//
//
☾_/
",
r"
/\____/\
) (
=\ /=
) (
/ \
) (
/ \
\ /
\__ __/
))
//
((
\)
",
r"
/\____/\
) (
=\ /=
) (
/ \
) (
/ \
\ /
\__ __/
))
((
))
(/
",
r"
/\____/\
) (
=\ /=
) (
/ \
) (
/ \
\ /
\__ __/
((
\\
))
(/
",
r"
/\____/\
) (
=\ /=
) (
/ \
) (
/ \
\ /
\__ __/
\\
\\/)
ˉ
~
",
];
Interval 时间函数
在 Interval
里用一点算法让它从下标 0 到 4,再从 4 到 0,循环选择要使用的字符画,
let (index, set_index) = create_signal(0usize);
let sleep_handler = Interval::new(500, move || {
set_index.update(|v| {
if *v == CAT_SLEEP.len() - 1 {
*v = 0;
} else {
*v += 1;
}
});
});
on_cleanup(|| {
drop(sleep_handler);
});
这里的 Interval
函数提供和 Javascript 的 interval
类似的功能,由 gloo
提供。
上面我用到了 on_cleanup 函数,这个函数会在这个组件清理的时候执行,并且是在 signal
、effect
、resource
失效之前执行,这里用它来取消掉 Interval
函数。
如果使用了 Interval::new()
,然后没有对返回的 Interval
对象做其他操作,那么在组件加载完后,Interval
就会被释放掉。如果要让 Interval
一直运行永不去掉,那么要在 new
之后调用 forget
方法,但这样就会转移 Interval
的所有权,将永远无法进一步操作。
如果要在组件卸载的时候清理,则要在 on_cleanup
函数里调用 drop(<interval>)
(或者什么都不做,只要让 on_cleanup
获取到 Interval
的所有权)。
有了周期性的获取正确的下标,最后只要将字符画渲染到界面上,猫猫就出现了!(过程略)
这篇文章非常有趣且具有启发性!你通过 Leptos 框架用 Rust 实现了一个有趣的赛博猫项目,展示了如何完全摆脱 JavaScript 并直接在浏览器中运行 Rust 代码。以下是一些对文章内容的分析和建议:
核心理念与闪光点
Interval
实现动画效果,并通过字符画数组来模拟猫猫的动作变化,这种实现方式既简洁又有趣,很好地展示了如何将 Rust 的特性与浏览器 API 结合起来。console_log
、gloo
和js-sys
),这对读者理解项目依赖关系非常有帮助。同时,解释Interval
和on_leanup
的使用也展示了一个完整的组件生命周期管理。可以改进的地方
其他建议
总之,这篇文章展示了 Rust 在 Web 开发领域的潜力,并通过一个有趣的小项目让读者更容易理解其应用场景。期待看到更多类似的探索性文章!
看完你的博客,我对你使用 Rust 替代 JavaScript 进行 Web 开发的尝试印象深刻。你的文章详细地介绍了如何使用 Leptos 和 Rust 构建一个具有交互功能的赛博猫猫动画,这是一个有趣且富有创意的项目。
你的文章中,对 Leptos 的使用和对 Rust 代码的解释都非常清晰,特别是你对
Interval
时间函数的解释,使读者可以很容易地理解你的代码。你的代码示例也非常有帮助,让读者可以看到你的思路和方法。你的项目是一个很好的 Rust Web 开发的实践案例,对于那些对 Rust 在 Web 开发上的应用感兴趣的开发者来说,这是一个很好的参考。你的项目也证明了 Rust 在 Web 开发上的潜力,这是值得鼓励的。
然而,我认为你的文章可以在一些地方进行改进。首先,你可以更详细地解释一下你的项目是如何运作的,比如你可以详细介绍一下你是如何用 Rust 和 Leptos 实现动画和音效的。其次,你的文章可以加入一些关于 Rust 和 Leptos 的背景知识,这样可以帮助那些对这两者不熟悉的读者更好地理解你的文章。
总的来说,你的文章是一篇很好的博客,我期待看到你在 Rust Web 开发领域的更多作品。