浅谈AntDesignPro菜单⾃定义icon
Ant Design Pro 官⽅⽂档说明
由于 umi 的限制,在 fig.js 是不能直接只是⽤组件的,Pro 中暂时⽀持使⽤本⾝的 icon type,和传⼊⼀个 img 的 url。只需要直接在 icon 属性上配置即可,如果是个 url,Pro 会⾃动处理为⼀
个 img 标签。
如果这样还不能满⾜需求,可以⾃定义 getIcon ⽅法。
如果你想使⽤ iconfont 的图标,你可以使⽤的⾃定义图标.
1. getIcon⽅法
/* eslint no-useless-escape:0 */
const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
export function isUrl(path) {
st(path);
}
import { isUrl } from '../utils/utils';
const getIcon = icon => {
if (typeof icon === 'string') {
if (isUrl(icon)) {
return <Icon component={() => <img src={icon} alt="icon" className={styles.icon} />} />;
}
if (icon.startsWith('icon-')) {
return <IconFont type={icon} />;
}
return <Icon type={icon} />;
}
return icon;
};
这个getIcon 来⾃于 AntD Pro 源代码 getIcon 很全⾯,既可以⽤ Icon(使⽤AntD 提供的icon),⼜可以⽤ IconFont(使⽤仓库的icon),还可以⽤静态资源⽂件(<img src={....} /> 转换成 icon);
实际项⽬中很多时候是需要替换成公司设计师设计的icon,因此我将他做了个简单的转换
const MenuIcon = ({imgStyle, imgSrc}) => (
<Icon
component={() => (
<img
style={{width: '1em', height: '1em', ...imgStyle}}
src={imgSrc}
alt="icon"
/>
)}
/>
);
// example
// imgStyle 是由于UI切图尺⼨经常不够准确 img位置需要微调
const menuData = [
{
name: '⾸页',
icon: <MenuIcon imgSrc={require('../assets/menu.png')} imgStyle={{marginBottom: 5}} />,
path: 'home',
},
]
注意:img width height 设置为 1em ,让它⾃适应parent组件的⼤⼩,实现菜单打开/关闭时,图⽚的缩放,如果给具体数值则没有缩放效果
2. 使⽤的⾃定义图标(使⽤ svg).
利⽤ Icon 组件封装⼀个可复⽤的⾃定义图标。可以通过 component 属性传⼊⼀个组件来渲染最终的图标,以满⾜特定的需求。
代码来⾃于
import { Icon } from 'antd';
const HeartSvg = () => (
<svg width="1em" height="1em" fill="currentColor" viewBox="0 0 1024 1024">
<path d="M923 283.6c-13.4-31.1-32.6-58.9-56.9-82.8-24.3-23.8-52.5-42.4-84-55.5-32.5-13.5-66.9-20.3-102.4-20.3-49.3 0-97.4 13.5-139.2 39-10 6.1-19.5 12.8-28.5 20.1-9-7.3-18.5-14-28.5-20.1-41.8-25.5-89.9-39-139.2-39-35.5 0-69.9 6.8-102.4 20.3-31.4 13-59.7 31 </svg>
);
const PandaSvg = () => (
<svg viewBox="0 0 1024 1024" width="1em" height="1em" fill="currentColor">
<path
d="M99.096 315.634s-82.58-64.032-82.58-132.13c0-66.064 33.032-165.162 148.646-148.646 83.37 11.91 99.096 165.162 99.096 165.162l-165.162 115.614zM924.906 315.634s82.58-64.032 82.58-132.13c0-66.064-33.032-165.162-148.646-148.646-83.37 11.91-9 fill="#6B676E"
p-id="1143"
/>
<path
d="M1024 561.548c0 264.526-229.23 429.42-512.002 429.42S0 826.076 0 561.548 283.96 66.064 512.002 66.064 1024 297.022 1024 561.548z"
fill="#FFEBD2"
p-id="1144"
/>
<path
d="M330.324 842.126c0 82.096 81.34 148.646 181.678 148.646s181.678-66.55 181.678-148.646H330.324z"
fill="#E9D7C3"
p-id="1145"
/>
<path
d="M644.13 611.098C594.582 528.516 561.55 512 512.002 512c-49.548 0-82.58 16.516-132.13 99.096-42.488 70.814-78.73 211.264-49.548 247.742 66.064 82.58 165.162 33.032 181.678 33.032 16.516 0 115.614 49.548 181.678-33.032 29.18-36.476-7.064-176 fill="#FFFFFF"
p-id="1146"
/>
<path
d="M611.098 495.484c0-45.608 36.974-82.58 82.58-82.58 49.548 0 198.194 99.098 198.194 165.162s-79.934 144.904-148.646 99.096c-49.548-33.032-132.128-148.646-132.128-181.678zM412.904 495.484c0-45.608-36.974-82.58-82.58-82.58-49.548 0-198.194 9 fill="#6B676E"
p-id="1147"
/>
<path
d="M512.002 726.622c-30.06 0-115.614 5.668-115.614 33.032 0 49.638 105.484 85.24 115.614 82.58 10.128 2.66 115.614-32.944 115.614-82.58-0.002-27.366-85.556-33.032-115.614-33.032z"
fill="#464655"
p-id="1148"
/>
<path
d="M330.324 495.484m-33.032 0a33.032 33.032 0 1 0 66.064 0 33.032 33.032 0 1 0-66.064 0Z"
fill="#464655"
p-id="1149"
/>
<path
d="M693.678 495.484m-33.032 0a33.032 33.032 0 1 0 66.064 0 33.032 33.032 0 1 0-66.064 0Z"
fill="#464655"
p-id="1150"
/>
</svg>
);
const HeartIcon = props => <Icon component={HeartSvg} {...props} />;
const PandaIcon = props => <Icon component={PandaSvg} {...props} />;
<div className="custom-icons-list">
<HeartIcon style={{ color: 'hotpink' }} />
<PandaIcon style={{ fontSize: '32px' }} />
</div>,antdesignvue 表格合计
mountNode,
);
补充知识:Ant Design Pro Of Vue 项⽬中路由菜单icon 修改或新增
在 config / fig.js 中修改,直接从取,只要 icon 组件的 type 值即可。
如:
<a-icon type="user" />
以上这篇Ant Design Pro 菜单⾃定义 icon就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论