#前端框架 #Web #前端 # #过程宏

class_list

一个响应式辅助工具,确保前端框架(如 Leptos)中类列表字符串的规范化

7 个版本

0.1.7 2023 年 8 月 23 日
0.1.6 2023 年 8 月 23 日

#212WebAssembly

42 每月下载量

MIT 许可证

13KB
174

class_list

GitHub Badge crates.io Badge docs.rs Badge Build Status Badge

一个响应式辅助工具,确保前端框架(如 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",
]

实现特质

如果你想直接将类型传递给宏而不是每次都进行转换,可以实现 ClassListClassToggle 类型。

查看 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