当前位置:   article > 正文

ant-design-vue在vue2中自定义icon的实现_vue2 自定义svgicon

vue2 自定义svgicon

此次的目的:自定义两个icon

实现方式有好几种,此次用svg     

 这是目标效果:

这是官方社区文档中的原代码:

  1. <template>
  2. <div class="custom-icons-list">
  3. <heart-icon :style="{ color: 'hotpink' }" />
  4. <panda-icon :style="{ fontSize: '32px' }" />
  5. </div>
  6. </template>
  7. <script>
  8. const HeartSvg = {
  9. template: `
  10. <svg width="1em" height="1em" fill="currentColor" viewBox="0 0 1024 1024">
  11. <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.7-84 55.5-24.4 23.9-43.5 51.7-56.9 82.8-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3 0.1-35.3-7-69.6-20.9-101.9z" />
  12. </svg>
  13. `,
  14. };
  15. const PandaSvg = {
  16. template: `
  17. <svg viewBox="0 0 1024 1024" width="1em" height="1em" fill="currentColor">
  18. <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-99.096 165.162-99.096 165.162l165.162 115.614z" fill="#6B676E" p-id="1143" />
  19. <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" />
  20. <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" />
  21. <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.93-49.55-247.74z" fill="#FFFFFF" p-id="1146" />
  22. <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 99.098-198.194 165.162s79.934 144.904 148.646 99.096c49.548-33.032 132.128-148.646 132.128-181.678z" fill="#6B676E" p-id="1147" />
  23. <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" />
  24. <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" />
  25. <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" />
  26. </svg>
  27. `,
  28. };
  29. const HeartIcon = {
  30. template: `
  31. <a-icon :component="HeartSvg" />
  32. `,
  33. data() {
  34. return {
  35. HeartSvg,
  36. };
  37. },
  38. };
  39. const PandaIcon = {
  40. template: `
  41. <a-icon :component="PandaSvg" />
  42. `,
  43. data() {
  44. return {
  45. PandaSvg,
  46. };
  47. },
  48. };
  49. export default {
  50. components: {
  51. HeartIcon,
  52. PandaIcon,
  53. },
  54. };
  55. </script>
  56. <style scoped>
  57. .custom-icons-list >>> .anticon {
  58. margin-right: 6px;
  59. }
  60. </style>

vue2项目中直接复制粘贴这一块代码肯定是运行不了的,会报警告

[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

概括起来就是 “模式不对,编译不了

具体原因:

        vue2有两种形式的代码 compiler(模板)模式和runtime模式(运行时),Vue2默认为runtime模式(具体原因是因为引入的文件),而官方社区文档中的原代码属于compiler模式的,匹配不上所以就会出现上面的错误信息

解决办法:

解决办法有好几个,我推荐就是直接别写成compiler模式的代码。直接自定义俩组件就行,很简单

demo:

文件结构:

 DiyIcon:

  1. <template>
  2. <div>
  3. <PandaIcon :style="{ fontSize: '32px' }"></PandaIcon>
  4. <HeartIcon :style="{ color: 'hotpink', fontSize: '32px' }"></HeartIcon>
  5. </div>
  6. </template>
  7. <script>
  8. import PandaIcon from './PandaIcon/index.vue';
  9. import HeartIcon from './HeartIcon/index.vue';
  10. export default {
  11. name: 'DiyIcon',
  12. components: {
  13. PandaIcon,
  14. HeartIcon,
  15. },
  16. data() {
  17. return {};
  18. },
  19. };
  20. </script>
  21. <style lang="less" scoped></style>

PandaIcon:

  1. <template>
  2. <div>
  3. <svg
  4. viewBox="0 0 1024 1024"
  5. width="1em"
  6. height="1em"
  7. fill="currentColor">
  8. <path
  9. 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-99.096 165.162-99.096 165.162l165.162 115.614z"
  10. fill="#6B676E"
  11. p-id="1143" />
  12. <path
  13. 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"
  14. fill="#FFEBD2"
  15. p-id="1144" />
  16. <path
  17. d="M330.324 842.126c0 82.096 81.34 148.646 181.678 148.646s181.678-66.55 181.678-148.646H330.324z"
  18. fill="#E9D7C3"
  19. p-id="1145" />
  20. <path
  21. 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.93-49.55-247.74z"
  22. fill="#FFFFFF"
  23. p-id="1146" />
  24. <path
  25. 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 99.098-198.194 165.162s79.934 144.904 148.646 99.096c49.548-33.032 132.128-148.646 132.128-181.678z"
  26. fill="#6B676E"
  27. p-id="1147" />
  28. <path
  29. 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"
  30. fill="#464655"
  31. p-id="1148" />
  32. <path
  33. 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"
  34. fill="#464655"
  35. p-id="1149" />
  36. <path
  37. 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"
  38. fill="#464655"
  39. p-id="1150" />
  40. </svg>
  41. </div>
  42. </template>
  43. <script>
  44. export default {
  45. name: 'PandaIcon',
  46. data() {
  47. return {};
  48. },
  49. };
  50. </script>
  51. <style lang="less" scoped></style>

HeartIcon:

  1. <template>
  2. <div>
  3. <svg
  4. width="1em"
  5. height="1em"
  6. fill="currentColor"
  7. viewBox="0 0 1024 1024">
  8. <path
  9. 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.7-84 55.5-24.4 23.9-43.5 51.7-56.9 82.8-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3 0.1-35.3-7-69.6-20.9-101.9z" />
  10. </svg>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. name: 'HeartIcon',
  16. data() {
  17. return {};
  18. },
  19. };
  20. </script>
  21. <style lang="less" scoped></style>

最终效果:

 控制台无报错无警告,解决问题

 声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】

推荐阅读
相关标签