7 个版本
0.1.7 | 2023 年 8 月 23 日 |
---|---|
0.1.6 | 2023 年 8 月 23 日 |
#212 在 WebAssembly
42 每月下载量
13KB
174 行
class_list
一个响应式辅助工具,确保前端框架(如 Leptos)中类列表字符串的规范化。
使用方法
提供的示例将为 Leptos 框架 在-{上下文删除}之后,但它可以在-{上下文删除}之前使用,也可能在其他类似框架中使用。
这个库旨在保持独立,没有运行时依赖,但它只与 Leptos 进行了测试。
cargo add class_list
示例
class_list![]
默认将其自身包裹在一个移动闭包中,这意味着它默认是响应式的。
let (count, set_count) = create_signal(0);
set_interval(
move || {
set_count.update(|count| *count += 1);
},
Duration::from_millis(100),
);
let count_class = move || format!("count-{}", count());
let count_is_even = move || count() % 2 == 0;
view! {
<div class=class_list![
"default-class-names",
// Closures get called automatically.
count_class,
// Closures can be written directly into the macro.
move || format!("count-{}", count()),
// Both Option and Result can be used as values.
// None and Err result in no class name.
Some("option"),
None::<String>,
// More conveniently, class names can be bound to reactive toggles.
// "even" will only be applied when `count_is_even()` is true.
// You also don't need to call closures here.
"even" <=> count_is_even
] />
}
选项
每个选项后都必须跟一个 ;
。
原始
要生成一个非响应式 String,请在开始时添加 raw
选项。
class_list![
raw;
"default-class-names",
]
克隆
很少,你可能需要在传递之前克隆某些内容。
该宏通过 clone
选项使这变得容易,该选项在将其移动到闭包之前克隆变量。
如果可能,请尽量避免首先需要此选项。
class_list![
clone[count_class];
"default-class-names",
]
包
这永远不会需要,因为它由包装器 macro_rules!
自动提供。
在无法解析特质的导入的情况下(例如,在其他库内部使用时),可以重新定义路径。
路径应指向此库的根目录。
__class_list![
crate = ::your_lib::class_list;
"default-class-names",
]
实现特质
如果你想直接将类型传递给宏而不是每次都进行转换,可以实现 ClassList
和 ClassToggle
类型。
查看 traits.rs 以查看默认实现,这些是实现它们的良好示例。
// If you're using a type you don't own,
// you must wrap it in a new struct.
struct Bool(bool);
impl ClassList for Bool {
fn to_class_list(&self, normalize: bool) -> String {
// If the string could contain multiple class names
// you should use `normalize` to determine whether
// or not to call `.to_class_list()` on it before
// returning.
// If you're lazy you could always normalize, but
// then the string will be normalized multiple
// times for every update in the macro.
if self.0 {
"true".into()
} else {
"false".into()
}
}
}
impl ClassToggle for Bool {
fn to_class_toggle(&self) -> bool {
self.0
}
}
// Option, Result, and Fn are implemented in a way which
// allows any new type you implement to be automatically
// passed through.
assert_eq!(
class_list![
// ClassList
move || Bool(false),
Bool(true),
"class",
// ClassToggle
"hidden" <=> move || Bool(false),
"list",
](),
"false true class list".to_string()
);
依赖
~265–710KB
~17K SLoC