20260806224941
This commit is contained in:
1 parent
6baa339efa
commit
6938deef39
12 files changed
+367
-300
No files matched your search
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Lucide 图标注册表 — 懒加载所有图标并按名称查找。
|
||||
* 首次使用时动态 import('@lucide/vue'),之后缓存复用。
|
||||
* iconMap 为响应式 ref,加载完成后自动触发依赖它的 computed 重算。
|
||||
*/
|
||||
import { ref } from "vue";
|
||||
|
||||
const iconMap = ref(null);
|
||||
let loadingPromise = null;
|
||||
const KNOWN_NON_ICONS = new Set(["createLucideIcon"]);
|
||||
|
||||
async function ensureLoaded() {
|
||||
if (iconMap.value) return iconMap.value;
|
||||
if (!loadingPromise) {
|
||||
loadingPromise = import("@lucide/vue").then((mod) => {
|
||||
const map = {};
|
||||
for (const [key, component] of Object.entries(mod)) {
|
||||
if (!KNOWN_NON_ICONS.has(key) && key[0] === key[0].toUpperCase()) {
|
||||
map[key] = component;
|
||||
}
|
||||
}
|
||||
iconMap.value = map;
|
||||
return map;
|
||||
});
|
||||
}
|
||||
return loadingPromise;
|
||||
}
|
||||
|
||||
/** 获取所有图标名称(按字母排序),需要 await */
|
||||
export async function getIconNames() {
|
||||
const map = await ensureLoaded();
|
||||
return Object.keys(map).sort();
|
||||
}
|
||||
|
||||
/** 同步获取图标组件;响应式,加载完成后自动重算依赖的 computed */
|
||||
export function getIcon(name) {
|
||||
if (!iconMap.value || !name) return null;
|
||||
return iconMap.value[name] || null;
|
||||
}
|
||||
|
||||
/** 异步获取图标组件 */
|
||||
export async function getIconAsync(name) {
|
||||
const map = await ensureLoaded();
|
||||
return map[name] || null;
|
||||
}
|
||||
|
||||
/** 图标是否已加载完成 */
|
||||
export function isLoaded() {
|
||||
return iconMap.value !== null;
|
||||
}
|
||||
Reference in new issue
Block a user