Skip to content

FxIconSelect

图标选择器组件,提供搜索、分页、多 Tab 切换的图标选择功能。

v1.0.7+(推荐)

从 v1.0.7 开始,UI 预设拆分为独立的 picker 包,Vite 插件会自动检测已安装的 picker 包并注册 FxIconSelect 组件。

安装 picker 包

根据你的 UI 框架安装对应的 picker 包:

bash
pnpm add @fuxishi/svg-icon-element-plus-picker
bash
pnpm add @fuxishi/svg-icon-naive-picker
bash
pnpm add @fuxishi/svg-icon-antdv-picker
bash
pnpm add @fuxishi/svg-icon-tdesign-picker
bash
pnpm add @fuxishi/svg-icon-vanilla-picker
UI 框架Picker 包依赖
Element Plus@fuxishi/svg-icon-element-plus-pickerelement-plus
Naive UI@fuxishi/svg-icon-naive-pickernaive-ui
AntDv Next@fuxishi/svg-icon-antdv-pickerantdv-next
TDesign@fuxishi/svg-icon-tdesign-pickertdesign-vue-next
无 UI 框架@fuxishi/svg-icon-vanilla-picker

使用

安装 picker 包后,setupIcons(app) 会自动注册 FxIconSelect 组件,无需手动配置:

ts
// main.ts
import { setupIcons } from 'virtual:fx-svg-icon'

const app = createApp(App)
setupIcons(app) // 自动注册 FxIcon + 检测 picker 包并注册 FxIconSelect

在模板中直接使用:

vue
<template>
  <FxIconSelect v-model="iconName" placeholder="请选择图标" />
</template>

<script setup>
import { ref } from 'vue'
const iconName = ref('')
</script>

v1.0.6 及之前

WARNING

以下用法适用于 v1.0.6 及之前版本。v1.0.7+ 请使用上方的 picker 包方式。

v1.0.6 及之前版本内置了 UI 框架预设,FxIconSelect 会自动检测已安装的 UI 框架:

UI 框架检测方式预设组件
Element Plus检测 ElPopover 全局组件Element Plus 风格的选择器
Naive UI检测 NPopover 全局组件Naive UI 风格的选择器
AntDv Next检测 APopover 全局组件AntDv Next 风格的选择器
TDesign检测 TPopup 全局组件TDesign 风格的选择器

安装 UI 框架后,选择器会自动使用对应的预设,无需额外配置。

Props

属性类型默认值说明
modelValuestringv-model 绑定的图标名称
placeholderstring'请选择图标'占位文本
heightnumber418弹层高度(px)

Events

事件参数说明
update:modelValue(value: string)选中图标时触发

Headless 使用

如果不使用任何 UI 框架预设,可以通过 useIconSelect composable 自定义选择器的 UI:

vue
<template>
  <div>
    <input
      :value="iconSelect.inputValue.value"
      :placeholder="iconSelect.placeholder"
      readonly
      @click="iconSelect.handleInputClick"
    />
    <div v-if="iconSelect.visible.value">
      <!-- 自定义选择器 UI -->
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { useIconSelect } from '@fuxishi/svg-icon'

const iconName = ref('')
const iconSelect = useIconSelect({
  modelValue: () => iconName.value,
  onSelect: (value) => { iconName.value = value }
})
</script>

详见 useIconSelect

查看自定义示例

示例

基础

vue
<template>
  <FxIconSelect v-model="iconName" />
  <p>已选择:{{ iconName }}</p>
</template>

自定义高度和占位文本

vue
<template>
  <FxIconSelect
    v-model="iconName"
    placeholder="点击选择图标"
    :height="500"
  />
</template>

CSS 变量

@fuxishi/svg-icon-vanilla-picker(Vanilla 版本)支持通过 CSS 变量自定义主题。只需在组件外层覆盖对应的 CSS 变量即可:

css
/* 全局覆盖 */
:root {
  --fx-primary: #1677ff;
  --fx-border-radius: 8px;
}

/* 或针对单个选择器覆盖 */
.my-picker {
  --fx-primary: #1677ff;
}
vue
<template>
  <div class="my-picker">
    <FxIconSelect v-model="iconName" />
  </div>
</template>

可用变量

变量默认值说明
--fx-primary#409eff主题色(选中、hover、激活状态)
--fx-primary-light#ecf5ff主题色浅色(图标项 hover 背景)
--fx-color-text-primary#303133主文本色
--fx-color-text-regular#606266常规文本色
--fx-color-text-secondary#909399次要文本色(图标名称、提示文字)
--fx-color-text-placeholder#c0c4cc占位符 / 禁用文本色
--fx-color-bg#fff背景色
--fx-color-bg-hover#f0f2f5清除按钮 hover 背景色
--fx-border-color#dcdfe6边框色
--fx-border-color-light#e4e7ed浅边框色(分隔线、图标项边框)
--fx-border-radius4px基础圆角
--fx-border-radius-lg6px大圆角(输入框、弹窗)
--fx-font-size-sm12px小字号
--fx-font-size-base13px基础字号
--fx-font-size-md14px中字号(输入框、标签页)
--fx-transition0.2s过渡动画时长