IconFont.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = create;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  10. var React = _interopRequireWildcard(require("react"));
  11. var _Icon = _interopRequireDefault(require("./Icon"));
  12. var _excluded = ["type", "children"];
  13. var customCache = new Set();
  14. function isValidCustomScriptUrl(scriptUrl) {
  15. return Boolean(typeof scriptUrl === 'string' && scriptUrl.length && !customCache.has(scriptUrl));
  16. }
  17. function createScriptUrlElements(scriptUrls) {
  18. var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  19. var currentScriptUrl = scriptUrls[index];
  20. if (isValidCustomScriptUrl(currentScriptUrl)) {
  21. var script = document.createElement('script');
  22. script.setAttribute('src', currentScriptUrl);
  23. script.setAttribute('data-namespace', currentScriptUrl);
  24. if (scriptUrls.length > index + 1) {
  25. script.onload = function () {
  26. createScriptUrlElements(scriptUrls, index + 1);
  27. };
  28. script.onerror = function () {
  29. createScriptUrlElements(scriptUrls, index + 1);
  30. };
  31. }
  32. customCache.add(currentScriptUrl);
  33. document.body.appendChild(script);
  34. }
  35. }
  36. function create() {
  37. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  38. var scriptUrl = options.scriptUrl,
  39. _options$extraCommonP = options.extraCommonProps,
  40. extraCommonProps = _options$extraCommonP === void 0 ? {} : _options$extraCommonP;
  41. /**
  42. * DOM API required.
  43. * Make sure in browser environment.
  44. * The Custom Icon will create a <script/>
  45. * that loads SVG symbols and insert the SVG Element into the document body.
  46. */
  47. if (scriptUrl && typeof document !== 'undefined' && typeof window !== 'undefined' && typeof document.createElement === 'function') {
  48. if (Array.isArray(scriptUrl)) {
  49. // 因为iconfont资源会把svg插入before,所以前加载相同type会覆盖后加载,为了数组覆盖顺序,倒叙插入
  50. createScriptUrlElements(scriptUrl.reverse());
  51. } else {
  52. createScriptUrlElements([scriptUrl]);
  53. }
  54. }
  55. var Iconfont = /*#__PURE__*/React.forwardRef(function (props, ref) {
  56. var type = props.type,
  57. children = props.children,
  58. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  59. // children > type
  60. var content = null;
  61. if (props.type) {
  62. content = /*#__PURE__*/React.createElement("use", {
  63. xlinkHref: "#".concat(type)
  64. });
  65. }
  66. if (children) {
  67. content = children;
  68. }
  69. return /*#__PURE__*/React.createElement(_Icon.default, (0, _extends2.default)({}, extraCommonProps, restProps, {
  70. ref: ref
  71. }), content);
  72. });
  73. Iconfont.displayName = 'Iconfont';
  74. return Iconfont;
  75. }