Skip to content

useIconSelect

Headless composable,提供图标选择器的核心逻辑。FxIconSelect 组件的预设就是基于此 composable 构建。

参数

UseIconSelectOptions

参数类型默认值说明
modelValue() => string | undefined() => undefined获取当前选中的图标名称(getter 函数)
onSelect(value: string) => void() => {}选中图标时的回调
placeholderstring'请选择图标'占位文本
heightnumber418弹层高度(px)

返回值

UseIconSelectReturn

属性类型说明
visibleRef<boolean>弹层是否可见
activeTabRef<string>当前激活的 Tab key
inputValueComputedRef<string>输入框显示的值
placeholderstring占位文本
tabsComputedRef<IconSelectTab[]>Tab 列表
iconDataRef<Record<string, string[]>>所有图标数据
searchTextsRef<Record<string, string>>各 Tab 的搜索文本
currentPagesRef<Record<string, number>>各 Tab 的当前页码
pageSizenumber每页显示数量(30)
contentHeightComputedRef<number>弹层内容高度
tabContentHeightComputedRef<number>Tab 内容区域高度
iconListHeightComputedRef<number>图标列表高度

方法

方法参数说明
getFilteredIcons(key)key: string获取过滤后的图标列表
getPaginatedIcons(key)key: string获取当前页的图标列表
isSelected(prefix, iconName)prefix: string, iconName: string判断图标是否被选中
setListRef(key, el)key: string, el: HTMLElement | null设置图标列表 DOM 引用
handleInputClick()点击输入框,切换弹层显隐
handleSelectIcon(prefix, iconName)prefix: string, iconName: string选中图标
closePopover()关闭弹层

IconSelectTab

属性类型说明
keystringTab 标识('svg' 或图标集前缀)
labelstringTab 显示文本

示例

基础用法

vue
<template>
  <div>
    <input
      :value="iconSelect.inputValue.value"
      :placeholder="iconSelect.placeholder"
      readonly
      @click="iconSelect.handleInputClick"
    />
    <div v-if="iconSelect.visible.value">
      <div v-for="tab in iconSelect.tabs.value" :key="tab.key">
        <button @click="iconSelect.activeTab.value = tab.key">
          {{ tab.label }}
        </button>
      </div>
    </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>