问一下,vue如何循环渲染svg图,想做成这个效果,左侧有几个数据,右侧就有几个圆圈图
vue本身就是响应式渲染的,把这些动态数值都定义在data里面,然后在用js改变这些data值就行了;
安装依赖
npm install --save-dev svg-sprite-loader
问题描述比较清晰,参考资料提供了实现该问题的一些代码和说明。根据参考资料和已有的知识,我可以给出以下解决方案:
在src/icons目录下创建svg文件夹,用于保存图标。将需要使用的SVG图标文件放入该文件夹中。
创建index.js文件,用于注册全局组件和导入SVG图标文件。index.js的代码如下:
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg component
// 注册全局组件
Vue.component('svg-icon', SvgIcon)
// 导入所有的svg格式,使用require.context动态导入
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
<template>
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
import { isExternal } from '@/utils/validate'
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
}
},
computed: {
isExternal() {
return isExternal(this.iconClass)
},
iconName() {
return `#icon-${this.iconClass}`
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className
} else {
return 'svg-icon'
}
},
styleExternalIcon() {
return {
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
}
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.svg-external-icon {
background-color: currentColor;
mask-size: cover!important;
display: inline-block;
}
</style>
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
import '@/icons'
接下来,你可以在Vue的组件中使用标签来循环渲染SVG图形。例如,你可以使用v-for指令来循环渲染一组图标,代码如下:
<template>
<div>
<svg-icon v-for="icon in icons" :key="icon" :icon-class="icon" />
</div>
</template>
<script>
export default {
data() {
return {
icons: ['user', 'home', 'settings'] // 根据需要替换为实际的图标名称数组
}
}
}
</script>
通过以上步骤,你就可以在Vue中循环渲染SVG图形了。每个图标会使用组件进行渲染,组件会根据传入的图标名称动态加载对应的SVG图标。