用户vue3封装一个动态加载IconPark的组件
时间: 2023-11-01 10:06:42 浏览: 72
好的,我可以帮你实现一个Vue3组件来动态加载IconPark字体图标库。首先,你需要在项目中安装 `@icon-park/vue-next` 和 `@vue/runtime-dom` 两个包,分别用于引入IconPark和Vue3的运行时。
安装命令如下:
```bash
npm install @icon-park/vue-next @vue/runtime-dom
```
接着,你可以创建一个名为 `IconPark.vue` 的组件,代码如下:
```vue
<template>
<svg :class="['icon', className]" :style="style">
<use :href="`#${iconName}`"></use>
</svg>
</template>
<script>
import { defineComponent, h } from '@vue/runtime-dom'
import { IconPark } from '@icon-park/vue-next'
export default defineComponent({
name: 'IconPark',
props: {
name: {
type: String,
required: true
},
size: {
type: Number,
default: 16
},
color: {
type: String,
default: '#333'
},
className: {
type: String,
default: ''
},
style: {
type: Object,
default: null
}
},
setup(props) {
const iconName = `icon-${props.name}`
const icon = IconPark.get(iconName)
if (!icon) {
console.warn(`[IconPark]: icon '${iconName}' not found`)
return null
}
const width = props.size
const height = props.size
const color = props.color
const style = {
width: `${width}px`,
height: `${height}px`,
fill: color
}
return {
iconName,
style
}
},
render() {
return h('div', this.style, [
h('svg', {
class: ['icon', this.className],
style: this.style
}, [
h('use', {
href: `#${this.iconName}`
})
])
])
}
})
</script>
<style>
.icon {
display: inline-block;
vertical-align: middle;
overflow: hidden;
}
</style>
```
这里定义了一个 `IconPark` 组件,它接受以下 props:
- `name`:要使用的 IconPark 图标的名称,必填。
- `size`:图标的大小,默认为 `16`。
- `color`:图标的颜色,默认为 `#333`。
- `className`:图标的类名。
- `style`:图标的样式。
在 `setup` 函数中,我们通过 `IconPark.get` 方法获取了对应的图标对象,并计算出了样式。如果找不到对应的图标,我们会输出一条警告,并返回 `null`。
最后,在 `render` 函数中,我们使用了 `h` 函数来创建一个 `svg` 元素,并在其中使用 `use` 元素来引用图标。注意,我们这里用了 `h` 函数而不是直接写模板,因为 Vue3 的模板编译器不支持动态引用 SVG 的 `use` 元素。
现在,你就可以在其他组件中使用 `IconPark` 了,例如:
```vue
<template>
<div>
<IconPark name="wechat" size="24" color="#7bb32e" />
<IconPark name="github" size="24" color="#000" />
</div>
</template>
<script>
import IconPark from './IconPark.vue'
export default {
components: { IconPark }
}
</script>
```
这样就可以在页面中显示出 IconPark 的图标了。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)