From 3cdcc930959fb608a1a26dd643f81a1cd1c1853c Mon Sep 17 00:00:00 2001 From: K <1175047471@qq.com> Date: Mon, 29 Jan 2024 17:03:06 +0800 Subject: [PATCH] =?UTF-8?q?refactor(IconPicker):=20=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E5=8F=8A=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Icon/src/IconPicker.vue | 55 ++++++++++++++------------ 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/components/Icon/src/IconPicker.vue b/src/components/Icon/src/IconPicker.vue index 74c2f30..09536c2 100644 --- a/src/components/Icon/src/IconPicker.vue +++ b/src/components/Icon/src/IconPicker.vue @@ -1,6 +1,6 @@ <script lang="ts" setup> import { ref, watch, watchEffect } from 'vue' -import { Empty, Input, Pagination, Popover } from 'ant-design-vue' +import { Empty, Input, Popover } from 'ant-design-vue' import { useDebounceFn } from '@vueuse/core' import svgIcons from 'virtual:svg-icons-names' import SvgIcon from './SvgIcon.vue' @@ -8,7 +8,6 @@ import { getIcons } from './icons' import { useDesign } from '@/hooks/web/useDesign' import { ScrollContainer } from '@/components/Container' -import { usePagination } from '@/hooks/web/usePagination' import { useI18n } from '@/hooks/web/useI18n' import { copyText } from '@/utils/copyTextToClipboard' @@ -39,15 +38,13 @@ const icons = isSvgMode ? getSvgIcons() : getIcons() const currentSelect = ref('') const open = ref(false) -const currentList = ref(icons) +const currentList = ref(icons.slice(0, props.pageSize)) const { t } = useI18n() const { prefixCls } = useDesign('icon-picker') const debounceHandleSearchChange = useDebounceFn(handleSearchChange, 100) -const { getPaginationList, getTotal, setCurrentPage } = usePagination(currentList, props.pageSize) - watchEffect(() => { currentSelect.value = props.value }) @@ -60,24 +57,27 @@ watch( }, ) -function handlePageChange(page: number) { - setCurrentPage(page) -} - function handleClick(icon: string) { currentSelect.value = icon if (props.copy) copyText(icon, t('component.icon.copy')) } +const hiddenLoadMore = ref(false) +function loadMoreIcons() { + currentList.value = icons.slice(0, currentList.value.length + props.pageSize) + hiddenLoadMore.value = currentList.value.length >= icons.length +} + function handleSearchChange(e: ChangeEvent) { const value = e.target.value if (!value) { - setCurrentPage(1) - currentList.value = icons + hiddenLoadMore.value = false + currentList.value = icons.slice(0, props.pageSize) return } currentList.value = icons.filter(item => item.includes(value)) + hiddenLoadMore.value = true } </script> @@ -90,32 +90,37 @@ function handleSearchChange(e: ChangeEvent) { <Popover v-model="open" placement="bottomLeft" trigger="click" :overlay-class-name="`${prefixCls}-popover`"> <template #title> <div class="flex justify-between"> - <Input :placeholder="t('component.icon.search')" allow-clear @change="debounceHandleSearchChange" /> + <Input placeholder="Search" allow-clear @change="debounceHandleSearchChange"> + <template #prefix> + <span class="i-ant-design:search-outlined text-gray-600" /> + </template> + </Input> </div> </template> <template #content> - <div v-if="getPaginationList.length"> - <ScrollContainer class="border border-t-0 border-solid"> - <ul class="flex flex-wrap px-2"> + <div v-if="currentList.length"> + <ScrollContainer> + <ul class="grid grid-cols-8 gap-y-2"> <li - v-for="icon in getPaginationList" :key="icon" - :class="currentSelect === icon ? 'border border-primary' : ''" - class="mr-1 mt-1 w-1/8 flex cursor-pointer items-center justify-center border border-solid p-2 hover:border-primary" + v-for="icon in currentList" :key="icon" + :class="currentSelect === icon ? '!text-primary' : ''" + class="cursor-pointer text-center text-gray-600" :title="icon" @click="handleClick(icon)" > - <!-- <Icon :icon="icon" :prefix="prefix" /> --> <SvgIcon v-if="isSvgMode" :name="icon" /> - <span v-else :class="icon" /> + <span v-else :class="icon" class="text-18px" /> </li> </ul> + <div v-if="!hiddenLoadMore" class="mt-4 text-center text-gray-600"> + <a-button size="small" @click="loadMoreIcons"> + Load More + </a-button> + </div> </ScrollContainer> - <div v-if="getTotal >= pageSize" class="flex items-center justify-center py-2"> - <Pagination show-less-items size="small" :page-size="pageSize" :total="getTotal" @change="handlePageChange" /> - </div> </div> <template v-else> - <div class="p-5"> + <div class="p-5 text-gray-600"> <Empty /> </div> </template> @@ -124,7 +129,7 @@ function handleSearchChange(e: ChangeEvent) { <span v-if="isSvgMode && currentSelect" class="flex cursor-pointer items-center px-2 py-1"> <SvgIcon :name="currentSelect" /> </span> - <span v-else :class="currentSelect || 'i-ion:apps-outline'" class="cursor-pointer px-4 py-2" /> + <span v-else :class="currentSelect || 'i-ion:apps-outline'" class="cursor-pointer px-4 py-2 text-gray-600" /> </Popover> </template> </Input>