From 656696be4b70513e94f1341db8d1c2d3f43b3e6d Mon Sep 17 00:00:00 2001 From: Your Name <123456> Date: 星期三, 13 七月 2022 09:18:47 +0800 Subject: [PATCH] 登录跳转首页 --- src/components/iconSelector/index.vue | 498 +++++++++++++++++++++++++++--------------------------- 1 files changed, 249 insertions(+), 249 deletions(-) diff --git a/src/components/iconSelector/index.vue b/src/components/iconSelector/index.vue index 07de786..3010e16 100644 --- a/src/components/iconSelector/index.vue +++ b/src/components/iconSelector/index.vue @@ -1,252 +1,252 @@ -<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>--> -- Gitblit v1.9.2