| | |
| | | <!--<template>--> |
| | | <!-- <div class="icon-selector w100 h100">--> |
| | | <!-- <el-popover--> |
| | | <!-- placement="bottom"--> |
| | | <!-- :width="fontIconWidth"--> |
| | | <!-- trigger="click"--> |
| | | <!-- transition="el-zoom-in-top"--> |
| | | <!-- popper-class="icon-selector-popper"--> |
| | | <!-- @show="onPopoverShow"--> |
| | | <!-- >--> |
| | | <!-- <template #reference>--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="fontIconSearch"--> |
| | | <!-- :placeholder="fontIconPlaceholder"--> |
| | | <!-- :clearable="clearable"--> |
| | | <!-- :disabled="disabled"--> |
| | | <!-- :size="size"--> |
| | | <!-- ref="inputWidthRef"--> |
| | | <!-- @clear="onClearFontIcon"--> |
| | | <!-- @focus="onIconFocus"--> |
| | | <!-- @blur="onIconBlur"--> |
| | | <!-- >--> |
| | | <!-- <template #prepend>--> |
| | | <!-- <SvgIcon--> |
| | | <!-- :name="fontIconPrefix === '' ? prepend : fontIconPrefix"--> |
| | | <!-- class="font14"--> |
| | | <!-- v-if="fontIconPrefix === '' ? prepend?.indexOf('ele-') > -1 : fontIconPrefix?.indexOf('ele-') > -1"--> |
| | | <!-- />--> |
| | | <!-- <i v-else :class="fontIconPrefix === '' ? prepend : fontIconPrefix" class="font14"></i>--> |
| | | <!-- </template>--> |
| | | <!-- </el-input>--> |
| | | <!-- </template>--> |
| | | <!-- <template #default>--> |
| | | <!-- <div class="icon-selector-warp">--> |
| | | <!-- <div class="icon-selector-warp-title flex">--> |
| | | <!-- <div class="flex-auto">{{ title }}</div>--> |
| | | <!-- <div class="icon-selector-warp-title-tab" v-if="type === 'all'">--> |
| | | <!-- <span :class="{ 'span-active': fontIconType === 'ali' }" @click="onIconChange('ali')" class="ml10" title="iconfont 图标">ali</span>--> |
| | | <!-- <span :class="{ 'span-active': fontIconType === 'ele' }" @click="onIconChange('ele')" class="ml10" title="elementPlus 图标">ele</span>--> |
| | | <!-- <span :class="{ 'span-active': fontIconType === 'awe' }" @click="onIconChange('awe')" class="ml10" title="fontawesome 图标">awe</span>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="icon-selector-warp-row">--> |
| | | <!-- <el-scrollbar ref="selectorScrollbarRef">--> |
| | | <!-- <el-row :gutter="10" v-if="fontIconSheetsFilterList.length > 0">--> |
| | | <!-- <el-col :xs="6" :sm="4" :md="4" :lg="4" :xl="4" @click="onColClick(v)" v-for="(v, k) in fontIconSheetsFilterList" :key="k">--> |
| | | <!-- <div class="icon-selector-warp-item" :class="{ 'icon-selector-active': fontIconPrefix === v }">--> |
| | | <!-- <div class="flex-margin">--> |
| | | <!-- <div class="icon-selector-warp-item-value">--> |
| | | <!-- <SvgIcon :name="v" />--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </el-col>--> |
| | | <!-- </el-row>--> |
| | | <!-- <el-empty :image-size="100" v-if="fontIconSheetsFilterList.length <= 0" :description="emptyDescription"></el-empty>--> |
| | | <!-- </el-scrollbar>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </template>--> |
| | | <!-- </el-popover>--> |
| | | <!-- </div>--> |
| | | <!--</template>--> |
| | | <template> |
| | | <div class="icon-selector w100 h100"> |
| | | <el-popover placement="bottom" :width="fontIconWidth" trigger="click" transition="el-zoom-in-top" popper-class="icon-selector-popper" @show="onPopoverShow"> |
| | | <template #reference> |
| | | <el-input v-model="fontIconSearch" :placeholder="fontIconPlaceholder" :clearable="clearable" :disabled="disabled" :size="size" ref="inputWidthRef" @clear="onClearFontIcon" @focus="onIconFocus" @blur="onIconBlur"> |
| | | <template #prepend> |
| | | <SvgIcon :name="fontIconPrefix === '' ? prepend : fontIconPrefix" class="font14" v-if="fontIconPrefix === '' ? prepend?.indexOf('ele-') > -1 : fontIconPrefix?.indexOf('ele-') > -1" /> |
| | | <i v-else :class="fontIconPrefix === '' ? prepend : fontIconPrefix" class="font14"></i> |
| | | </template> |
| | | </el-input> |
| | | </template> |
| | | <template #default> |
| | | <div class="icon-selector-warp"> |
| | | <div class="icon-selector-warp-title flex"> |
| | | <div class="flex-auto">{{ title }}</div> |
| | | <div class="icon-selector-warp-title-tab" v-if="type === 'all'"> |
| | | <span :class="{ 'span-active': fontIconType === 'ali' }" @click="onIconChange('ali')" class="ml10" title="iconfont 图标">ali</span> |
| | | <span :class="{ 'span-active': fontIconType === 'ele' }" @click="onIconChange('ele')" class="ml10" title="elementPlus 图标">ele</span> |
| | | <span :class="{ 'span-active': fontIconType === 'awe' }" @click="onIconChange('awe')" class="ml10" title="fontawesome 图标">awe</span> |
| | | </div> |
| | | </div> |
| | | <div class="icon-selector-warp-row"> |
| | | <el-scrollbar ref="selectorScrollbarRef"> |
| | | <el-row :gutter="10" v-if="fontIconSheetsFilterList.length > 0"> |
| | | <el-col :xs="6" :sm="4" :md="4" :lg="4" :xl="4" @click="onColClick(v)" v-for="(v, k) in fontIconSheetsFilterList" :key="k"> |
| | | <div class="icon-selector-warp-item" :class="{ 'icon-selector-active': fontIconPrefix === v }"> |
| | | <div class="flex-margin"> |
| | | <div class="icon-selector-warp-item-value"> |
| | | <SvgIcon :name="v" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <el-empty :image-size="100" v-if="fontIconSheetsFilterList.length <= 0" :description="emptyDescription"></el-empty> |
| | | </el-scrollbar> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-popover> |
| | | </div> |
| | | </template> |
| | | |
| | | <!--<script lang="ts">--> |
| | | <!--import { ref, toRefs, reactive, onMounted, nextTick, computed, watch, defineComponent } from 'vue';--> |
| | | <!--import initIconfont from '/@/utils/getStyleSheets';--> |
| | | <script lang="ts"> |
| | | import { ref, toRefs, reactive, onMounted, nextTick, computed, watch, defineComponent } from 'vue'; |
| | | // import initIconfont from '/@/utils/getStyleSheets'; |
| | | |
| | | <!--export default defineComponent({--> |
| | | <!-- name: 'iconSelector',--> |
| | | <!-- emits: ['update:modelValue', 'get', 'clear'],--> |
| | | <!-- props: {--> |
| | | <!-- // 输入框前置内容--> |
| | | <!-- prepend: {--> |
| | | <!-- type: String,--> |
| | | <!-- default: () => 'ele-Pointer',--> |
| | | <!-- },--> |
| | | <!-- // 输入框占位文本--> |
| | | <!-- placeholder: {--> |
| | | <!-- type: String,--> |
| | | <!-- default: () => '请输入内容搜索图标或者选择图标',--> |
| | | <!-- },--> |
| | | <!-- // 输入框占位文本--> |
| | | <!-- size: {--> |
| | | <!-- type: String,--> |
| | | <!-- default: () => 'default',--> |
| | | <!-- },--> |
| | | <!-- // 弹窗标题--> |
| | | <!-- title: {--> |
| | | <!-- type: String,--> |
| | | <!-- default: () => '请选择图标',--> |
| | | <!-- },--> |
| | | <!-- // icon 图标类型--> |
| | | <!-- type: {--> |
| | | <!-- type: String,--> |
| | | <!-- default: () => 'ele',--> |
| | | <!-- },--> |
| | | <!-- // 禁用--> |
| | | <!-- disabled: {--> |
| | | <!-- type: Boolean,--> |
| | | <!-- default: () => false,--> |
| | | <!-- },--> |
| | | <!-- // 是否可清空--> |
| | | <!-- clearable: {--> |
| | | <!-- type: Boolean,--> |
| | | <!-- default: () => true,--> |
| | | <!-- },--> |
| | | <!-- // 自定义空状态描述文字--> |
| | | <!-- emptyDescription: {--> |
| | | <!-- type: String,--> |
| | | <!-- default: () => '无相关图标',--> |
| | | <!-- },--> |
| | | <!-- // 双向绑定值,默认为 modelValue,--> |
| | | <!-- // 参考:https://v3.cn.vuejs.org/guide/migration/v-model.html#%E8%BF%81%E7%A7%BB%E7%AD%96%E7%95%A5--> |
| | | <!-- // 参考:https://v3.cn.vuejs.org/guide/component-custom-events.html#%E5%A4%9A%E4%B8%AA-v-model-%E7%BB%91%E5%AE%9A--> |
| | | <!-- modelValue: String,--> |
| | | <!-- },--> |
| | | <!-- setup(props, { emit }) {--> |
| | | <!-- const inputWidthRef = ref();--> |
| | | <!-- const selectorScrollbarRef = ref();--> |
| | | <!-- const state = reactive({--> |
| | | <!-- fontIconPrefix: '',--> |
| | | <!-- fontIconWidth: 0,--> |
| | | <!-- fontIconSearch: '',--> |
| | | <!-- fontIconTabsIndex: 0,--> |
| | | <!-- fontIconSheetsList: [],--> |
| | | <!-- fontIconPlaceholder: '',--> |
| | | <!-- fontIconType: 'ali',--> |
| | | <!-- fontIconShow: true,--> |
| | | <!-- });--> |
| | | <!-- // 处理 input 获取焦点时,modelValue 有值时,改变 input 的 placeholder 值--> |
| | | <!-- const onIconFocus = () => {--> |
| | | <!-- if (!props.modelValue) return false;--> |
| | | <!-- state.fontIconSearch = '';--> |
| | | <!-- state.fontIconPlaceholder = props.modelValue;--> |
| | | <!-- };--> |
| | | <!-- // 处理 input 失去焦点时,为空将清空 input 值,为点击选中图标时,将取原先值--> |
| | | <!-- const onIconBlur = () => {--> |
| | | <!-- setTimeout(() => {--> |
| | | <!-- const icon = state.fontIconSheetsList.filter((icon: string) => icon === state.fontIconSearch);--> |
| | | <!-- if (icon.length <= 0) state.fontIconSearch = '';--> |
| | | <!-- }, 300);--> |
| | | <!-- };--> |
| | | <!-- // 处理 icon 双向绑定数值回显--> |
| | | <!-- const initModeValueEcho = () => {--> |
| | | <!-- if (props.modelValue === '') return ((<string | undefined>state.fontIconPlaceholder) = props.placeholder);--> |
| | | <!-- (<string | undefined>state.fontIconPlaceholder) = props.modelValue;--> |
| | | <!-- (<string | undefined>state.fontIconPrefix) = props.modelValue;--> |
| | | <!-- };--> |
| | | <!-- // 处理 icon type 类型为 all 时,类型 ali、ele、awe 回显问题--> |
| | | <!-- const initFontIconTypeEcho = () => {--> |
| | | <!-- if ((<any>props.modelValue)?.indexOf('iconfont') > -1) onIconChange('ali');--> |
| | | <!-- else if ((<any>props.modelValue)?.indexOf('ele-') > -1) onIconChange('ele');--> |
| | | <!-- else if ((<any>props.modelValue)?.indexOf('fa') > -1) onIconChange('awe');--> |
| | | <!-- else onIconChange('ali');--> |
| | | <!-- };--> |
| | | <!-- // 图标搜索及图标数据显示--> |
| | | <!-- const fontIconSheetsFilterList = computed(() => {--> |
| | | <!-- if (!state.fontIconSearch) return state.fontIconSheetsList;--> |
| | | <!-- let search = state.fontIconSearch.trim().toLowerCase();--> |
| | | <!-- return state.fontIconSheetsList.filter((item: any) => {--> |
| | | <!-- if (item.toLowerCase().indexOf(search) !== -1) return item;--> |
| | | <!-- });--> |
| | | <!-- });--> |
| | | <!-- // 获取 input 的宽度--> |
| | | <!-- const getInputWidth = () => {--> |
| | | <!-- nextTick(() => {--> |
| | | <!-- state.fontIconWidth = inputWidthRef.value.$el.offsetWidth;--> |
| | | <!-- });--> |
| | | <!-- };--> |
| | | <!-- // 监听页面宽度改变--> |
| | | <!-- const initResize = () => {--> |
| | | <!-- window.addEventListener('resize', () => {--> |
| | | <!-- getInputWidth();--> |
| | | <!-- });--> |
| | | <!-- };--> |
| | | <!-- // 初始化数据--> |
| | | <!-- const initFontIconData = async (type: string) => {--> |
| | | <!-- state.fontIconSheetsList = [];--> |
| | | <!-- if (type === 'ali') {--> |
| | | <!-- await initIconfont.ali().then((res: any) => {--> |
| | | <!-- // 阿里字体图标使用 `iconfont xxx`--> |
| | | <!-- state.fontIconSheetsList = res.map((i: string) => `iconfont ${i}`);--> |
| | | <!-- });--> |
| | | <!-- } else if (type === 'ele') {--> |
| | | <!-- await initIconfont.ele().then((res: any) => {--> |
| | | <!-- state.fontIconSheetsList = res;--> |
| | | <!-- });--> |
| | | <!-- } else if (type === 'awe') {--> |
| | | <!-- await initIconfont.awe().then((res: any) => {--> |
| | | <!-- // fontawesome字体图标使用 `fa xxx`--> |
| | | <!-- state.fontIconSheetsList = res.map((i: string) => `fa ${i}`);--> |
| | | <!-- });--> |
| | | <!-- }--> |
| | | <!-- // 初始化 input 的 placeholder--> |
| | | <!-- // 参考(单项数据流):https://cn.vuejs.org/v2/guide/components-props.html?#%E5%8D%95%E5%90%91%E6%95%B0%E6%8D%AE%E6%B5%81--> |
| | | <!-- state.fontIconPlaceholder = props.placeholder;--> |
| | | <!-- // 初始化双向绑定回显--> |
| | | <!-- initModeValueEcho();--> |
| | | <!-- };--> |
| | | <!-- // 图标点击切换--> |
| | | <!-- const onIconChange = (type: string) => {--> |
| | | <!-- state.fontIconType = type;--> |
| | | <!-- initFontIconData(type);--> |
| | | <!-- };--> |
| | | <!-- // 获取当前点击的 icon 图标--> |
| | | <!-- const onColClick = (v: any) => {--> |
| | | <!-- state.fontIconPlaceholder = v;--> |
| | | <!-- state.fontIconPrefix = v;--> |
| | | <!-- emit('get', state.fontIconPrefix);--> |
| | | <!-- emit('update:modelValue', state.fontIconPrefix);--> |
| | | <!-- };--> |
| | | <!-- // 清空当前点击的 icon 图标--> |
| | | <!-- const onClearFontIcon = () => {--> |
| | | <!-- state.fontIconPrefix = '';--> |
| | | <!-- emit('clear', state.fontIconPrefix);--> |
| | | <!-- emit('update:modelValue', state.fontIconPrefix);--> |
| | | <!-- };--> |
| | | <!-- // 监听 Popover 打开,用于双向绑定值回显--> |
| | | <!-- const onPopoverShow = () => {--> |
| | | <!-- initModeValueEcho();--> |
| | | <!-- initFontIconTypeEcho();--> |
| | | <!-- };--> |
| | | <!-- // 页面加载时--> |
| | | <!-- onMounted(() => {--> |
| | | <!-- initModeValueEcho();--> |
| | | <!-- initResize();--> |
| | | <!-- getInputWidth();--> |
| | | <!-- });--> |
| | | export default defineComponent({ |
| | | name: 'iconSelector', |
| | | emits: ['update:modelValue', 'get', 'clear'], |
| | | props: { |
| | | // 输入框前置内容 |
| | | prepend: { |
| | | type: String, |
| | | default: () => 'ele-Pointer' |
| | | }, |
| | | // 输入框占位文本 |
| | | placeholder: { |
| | | type: String, |
| | | default: () => '请输入内容搜索图标或者选择图标' |
| | | }, |
| | | // 输入框占位文本 |
| | | size: { |
| | | type: String, |
| | | default: () => 'default' |
| | | }, |
| | | // 弹窗标题 |
| | | title: { |
| | | type: String, |
| | | default: () => '请选择图标' |
| | | }, |
| | | // icon 图标类型 |
| | | type: { |
| | | type: String, |
| | | default: () => 'ele' |
| | | }, |
| | | // 禁用 |
| | | disabled: { |
| | | type: Boolean, |
| | | default: () => false |
| | | }, |
| | | // 是否可清空 |
| | | clearable: { |
| | | type: Boolean, |
| | | default: () => true |
| | | }, |
| | | // 自定义空状态描述文字 |
| | | emptyDescription: { |
| | | type: String, |
| | | default: () => '无相关图标' |
| | | }, |
| | | // 双向绑定值,默认为 modelValue, |
| | | // 参考:https://v3.cn.vuejs.org/guide/migration/v-model.html#%E8%BF%81%E7%A7%BB%E7%AD%96%E7%95%A5 |
| | | // 参考:https://v3.cn.vuejs.org/guide/component-custom-events.html#%E5%A4%9A%E4%B8%AA-v-model-%E7%BB%91%E5%AE%9A |
| | | modelValue: String |
| | | }, |
| | | setup(props, { emit }) { |
| | | const inputWidthRef = ref(); |
| | | const selectorScrollbarRef = ref(); |
| | | const state = reactive({ |
| | | fontIconPrefix: '', |
| | | fontIconWidth: 0, |
| | | fontIconSearch: '', |
| | | fontIconTabsIndex: 0, |
| | | fontIconSheetsList: [], |
| | | fontIconPlaceholder: '', |
| | | fontIconType: 'ali', |
| | | fontIconShow: true |
| | | }); |
| | | // 处理 input 获取焦点时,modelValue 有值时,改变 input 的 placeholder 值 |
| | | const onIconFocus = () => { |
| | | if (!props.modelValue) return false; |
| | | state.fontIconSearch = ''; |
| | | state.fontIconPlaceholder = props.modelValue; |
| | | }; |
| | | // 处理 input 失去焦点时,为空将清空 input 值,为点击选中图标时,将取原先值 |
| | | const onIconBlur = () => { |
| | | setTimeout(() => { |
| | | const icon = state.fontIconSheetsList.filter((icon: string) => icon === state.fontIconSearch); |
| | | if (icon.length <= 0) state.fontIconSearch = ''; |
| | | }, 300); |
| | | }; |
| | | // 处理 icon 双向绑定数值回显 |
| | | const initModeValueEcho = () => { |
| | | if (props.modelValue === '') return ((<string | undefined>state.fontIconPlaceholder) = props.placeholder); |
| | | (<string | undefined>state.fontIconPlaceholder) = props.modelValue; |
| | | (<string | undefined>state.fontIconPrefix) = props.modelValue; |
| | | }; |
| | | // 处理 icon type 类型为 all 时,类型 ali、ele、awe 回显问题 |
| | | const initFontIconTypeEcho = () => { |
| | | if ((<any>props.modelValue)?.indexOf('iconfont') > -1) onIconChange('ali'); |
| | | else if ((<any>props.modelValue)?.indexOf('ele-') > -1) onIconChange('ele'); |
| | | else if ((<any>props.modelValue)?.indexOf('fa') > -1) onIconChange('awe'); |
| | | else onIconChange('ali'); |
| | | }; |
| | | // 图标搜索及图标数据显示 |
| | | const fontIconSheetsFilterList = computed(() => { |
| | | if (!state.fontIconSearch) return state.fontIconSheetsList; |
| | | let search = state.fontIconSearch.trim().toLowerCase(); |
| | | return state.fontIconSheetsList.filter((item: any) => { |
| | | if (item.toLowerCase().indexOf(search) !== -1) return item; |
| | | }); |
| | | }); |
| | | // 获取 input 的宽度 |
| | | const getInputWidth = () => { |
| | | nextTick(() => { |
| | | state.fontIconWidth = inputWidthRef.value.$el.offsetWidth; |
| | | }); |
| | | }; |
| | | // 监听页面宽度改变 |
| | | const initResize = () => { |
| | | window.addEventListener('resize', () => { |
| | | getInputWidth(); |
| | | }); |
| | | }; |
| | | // 初始化数据 |
| | | const initFontIconData = async (type: string) => { |
| | | state.fontIconSheetsList = []; |
| | | if (type === 'ali') { |
| | | await initIconfont.ali().then((res: any) => { |
| | | // 阿里字体图标使用 `iconfont xxx` |
| | | state.fontIconSheetsList = res.map((i: string) => `iconfont ${i}`); |
| | | }); |
| | | } else if (type === 'ele') { |
| | | await initIconfont.ele().then((res: any) => { |
| | | state.fontIconSheetsList = res; |
| | | }); |
| | | } else if (type === 'awe') { |
| | | await initIconfont.awe().then((res: any) => { |
| | | // fontawesome字体图标使用 `fa xxx` |
| | | state.fontIconSheetsList = res.map((i: string) => `fa ${i}`); |
| | | }); |
| | | } |
| | | // 初始化 input 的 placeholder |
| | | // 参考(单项数据流):https://cn.vuejs.org/v2/guide/components-props.html?#%E5%8D%95%E5%90%91%E6%95%B0%E6%8D%AE%E6%B5%81 |
| | | state.fontIconPlaceholder = props.placeholder; |
| | | // 初始化双向绑定回显 |
| | | initModeValueEcho(); |
| | | }; |
| | | // 图标点击切换 |
| | | const onIconChange = (type: string) => { |
| | | state.fontIconType = type; |
| | | initFontIconData(type); |
| | | }; |
| | | // 获取当前点击的 icon 图标 |
| | | const onColClick = (v: any) => { |
| | | state.fontIconPlaceholder = v; |
| | | state.fontIconPrefix = v; |
| | | emit('get', state.fontIconPrefix); |
| | | emit('update:modelValue', state.fontIconPrefix); |
| | | }; |
| | | // 清空当前点击的 icon 图标 |
| | | const onClearFontIcon = () => { |
| | | state.fontIconPrefix = ''; |
| | | emit('clear', state.fontIconPrefix); |
| | | emit('update:modelValue', state.fontIconPrefix); |
| | | }; |
| | | // 监听 Popover 打开,用于双向绑定值回显 |
| | | const onPopoverShow = () => { |
| | | initModeValueEcho(); |
| | | initFontIconTypeEcho(); |
| | | }; |
| | | // 页面加载时 |
| | | onMounted(() => { |
| | | initModeValueEcho(); |
| | | initResize(); |
| | | getInputWidth(); |
| | | }); |
| | | |
| | | <!-- // 监听双向绑定 modelValue 的变化--> |
| | | <!-- watch(--> |
| | | <!-- () => props.modelValue,--> |
| | | <!-- () => {--> |
| | | <!-- initModeValueEcho();--> |
| | | <!-- }--> |
| | | <!-- );--> |
| | | <!-- return {--> |
| | | <!-- inputWidthRef,--> |
| | | <!-- selectorScrollbarRef,--> |
| | | <!-- fontIconSheetsFilterList,--> |
| | | <!-- onColClick,--> |
| | | <!-- onIconChange,--> |
| | | <!-- onClearFontIcon,--> |
| | | <!-- onIconFocus,--> |
| | | <!-- onIconBlur,--> |
| | | <!-- onPopoverShow,--> |
| | | <!-- ...toRefs(state),--> |
| | | <!-- };--> |
| | | <!-- },--> |
| | | <!--});--> |
| | | <!--</script>--> |
| | | // 监听双向绑定 modelValue 的变化 |
| | | watch( |
| | | () => props.modelValue, |
| | | () => { |
| | | initModeValueEcho(); |
| | | } |
| | | ); |
| | | return { |
| | | inputWidthRef, |
| | | selectorScrollbarRef, |
| | | fontIconSheetsFilterList, |
| | | onColClick, |
| | | onIconChange, |
| | | onClearFontIcon, |
| | | onIconFocus, |
| | | onIconBlur, |
| | | onPopoverShow, |
| | | ...toRefs(state) |
| | | }; |
| | | } |
| | | }); |
| | | </script> |