You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将Tailwind的Heroicons图标导入Vue项目的数组中

问题原因

你当前的错误在于直接将组件的JSX/模板标签写在了TS数组的字段中,TS文件无法直接解析这种标签语法,也不需要通过这种方式传递图标组件。

第一步:修改picturesData.ts文件

icon字段直接存你导入的组件引用即可,不需要加尖括号包裹:

import { AcademicCapIcon, ClockIcon, MailIcon } from '@heroicons/vue/outline'
const picturesData = [
    {
      img: "image1",
      title: "education",
      src: "education.jpg",
      subtitle: "Because we are all students",
      icon: AcademicCapIcon,
    },
    {
      img: "image2",
      title: "recreational",
      src: "recreation.jpg",
      subtitle: "Who doesn't like having fun?",
      icon: ClockIcon      
    },
    {
      img: "image3",
      title: "social",
      src: "social.jpg",
      subtitle: "Need some friends?",
      icon: MailIcon      
    },
]
export default picturesData

第二步:Vue模板中渲染图标

在使用v-for渲染列表的位置,用Vue内置的<component>动态组件绑定icon字段即可,同时可以直接传Tailwind类名控制图标的大小、颜色等样式:

<template>
  <div class="grid grid-cols-3 gap-4">
    <div 
      v-for="item in picturesData" 
      :key="item.img"
      class="border rounded p-4"
    >
      <!-- 渲染图标 -->
      <component :is="item.icon" class="w-8 h-8 text-indigo-600 mb-2" />
      <img :src="item.src" :alt="item.title" class="w-full h-48 object-cover mb-2">
      <h2 class="text-lg font-bold mb-1">{{ item.title }}</h2>
      <p class="text-gray-600">{{ item.subtitle }}</p>
    </div>
  </div>
</template>

<script setup lang="ts">
import picturesData from './picturesData'
</script>

可选优化:加TS类型约束

如果需要更严谨的类型校验,可以给数组项加类型标注:

import type { Component } from 'vue'
import { AcademicCapIcon, ClockIcon, MailIcon } from '@heroicons/vue/outline'

interface PictureItem {
  img: string
  title: string
  src: string
  subtitle: string
  icon: Component
}

const picturesData: PictureItem[] = [
  // 数组内容同上
]

内容的提问来源于stack exchange,提问作者Festina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:36:03