-
Notifications
You must be signed in to change notification settings - Fork 18
/
Icon.tsx
83 lines (71 loc) · 1.73 KB
/
Icon.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { Component } from 'react';
import * as React from 'react';
import * as classNames from 'classnames';
import {IBaseComponent} from '../template/component';
import Archer from 'archer-svgs';
export interface IIconProps extends IBaseComponent {
/**
* 图标名称
*/
type?: string;
/**
* 渲染svg
*/
svg?: string;
}
export interface IIconState {
svgHtml: string;
}
const svgTarget = 'https://unpkg.com/ionicons@4.4.2/dist/ionicons/svg/';
const archer = new Archer();
/**
* **图标**-展示对应的矢量化图标。
*/
export class Icon extends Component<IIconProps, IIconState> {
state = {
svgHtml: ''
};
getSvg = async (type: string) => {
return await archer.fetchSvg(`${svgTarget}${type}.svg`);
}
async componentDidMount() {
// 不使用ionicons图标时不进行加载,提高性能
if (!this.props.type) {
return;
}
// tslint:disable-next-line no-any
const svg = await this.getSvg(this.props.type);
this.setState({
svgHtml: svg,
});
}
async componentWillReceiveProps(props: IIconProps) {
if (!props.type) {
return;
}
if (this.props.type !== props.type) {
// tslint:disable-next-line no-any
const svg = await this.getSvg(props.type);
this.setState({
svgHtml: svg,
});
}
}
render() {
const {className, style, type, svg, ...otherProps} = this.props;
const preCls = 'yoshino-icon';
const clsName = classNames(
preCls, className,
{[`${preCls}-${type}`]: !!type}
);
return (
<i
className={clsName}
style={style}
dangerouslySetInnerHTML={{__html: svg || this.state.svgHtml}}
{...otherProps}
/>
);
}
}
export default Icon;