AntDesignPro菜单⾃定义icon
Ant Design Pro 官⽅⽂档说明
由于 umi 的限制,在 是不能直接只是⽤组件的,Pro 中暂时⽀持 使⽤ 本⾝的 icon type,和传⼊⼀个 img 的 url。只需要直接在 icon
属性上配置即可,如果是个 url,Pro 会⾃动处理为⼀个 img 标签。
如果这样还不能满⾜需求,可以⾃定义 ⽅法。
如果你想使⽤ 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_]*)#?
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-')) {
icon图标库return <IconFont type={icon} />;
}
return <Icon type={icon} />;
}
return icon;
};
这个getIcon 来⾃于 AntD Pro 源代码 很全⾯,既可以⽤ 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 </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.61 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.0
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-13 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 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>,
mountNode,
);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论