ruoyi-plus-soybean/packages/hooks/src/use-svg-icon-render.ts

51 lines
966 B
TypeScript
Raw Normal View History

2023-11-17 08:45:00 +08:00
import { h } from 'vue';
import type { Component } from 'vue';
/**
2023-12-14 21:45:29 +08:00
* Svg icon render hook
*
* @param SvgIcon Svg icon component
2023-11-17 08:45:00 +08:00
*/
export default function useSvgIconRender(SvgIcon: Component) {
interface IconConfig {
2023-12-14 21:45:29 +08:00
/** Iconify icon name */
2023-11-17 08:45:00 +08:00
icon?: string;
2023-12-14 21:45:29 +08:00
/** Local icon name */
2023-11-17 08:45:00 +08:00
localIcon?: string;
2023-12-14 21:45:29 +08:00
/** Icon color */
2023-11-17 08:45:00 +08:00
color?: string;
2023-12-14 21:45:29 +08:00
/** Icon size */
2023-11-17 08:45:00 +08:00
fontSize?: number;
}
type IconStyle = Partial<Pick<CSSStyleDeclaration, 'color' | 'fontSize'>>;
/**
2023-12-14 21:45:29 +08:00
* Svg icon VNode
*
2023-11-17 08:45:00 +08:00
* @param config
*/
const SvgIconVNode = (config: IconConfig) => {
const { color, fontSize, icon, localIcon } = config;
const style: IconStyle = {};
if (color) {
style.color = color;
}
if (fontSize) {
style.fontSize = `${fontSize}px`;
}
if (!icon && !localIcon) {
return undefined;
}
return () => h(SvgIcon, { icon, localIcon, style });
};
return {
SvgIconVNode
};
}