Commit 2ee01fa6ea3200ec964d4e1b4765e48dfa7aeb3a

Authored by vben
1 parent b6e5c3f6

perf(import): perf components import

src/components/Application/index.ts
1   -import { withInstall } from '../util';
2 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
3 2 import AppLogo from './src/AppLogo.vue';
  3 +import AppProvider from './src/AppProvider.vue';
  4 +import { withInstall } from '../util';
4 5  
5 6 export const AppLocalePicker = createAsyncComponent(() => import('./src/AppLocalePicker.vue'));
6   -export const AppProvider = createAsyncComponent(() => import('./src/AppProvider.vue'));
7 7 export const AppSearch = createAsyncComponent(() => import('./src/search/AppSearch.vue'), {
8 8 loading: true,
9 9 });
10   -// export const AppLogo = createAsyncComponent(() => import('./src/AppLogo.vue'));
11   -
12   -withInstall(AppLocalePicker, AppLogo, AppProvider, AppSearch);
13 10  
14 11 export { useAppProviderContext } from './src/useAppContext';
15   -export { AppLogo };
  12 +export { AppLogo, AppProvider };
  13 +
  14 +withInstall(AppLogo, AppProvider);
... ...
src/components/Authority/index.ts
1 1 import { withInstall } from '../util';
2   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
3 2  
4   -export const Authority = createAsyncComponent(() => import('./src/index.vue'));
  3 +import Authority from './src/index.vue';
5 4  
6 5 withInstall(Authority);
  6 +
  7 +export { Authority };
... ...
src/components/Basic/index.ts
1   -import { withInstall } from '../util';
2 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
3 2  
4 3 export const BasicArrow = createAsyncComponent(() => import('./src/BasicArrow.vue'));
5 4 export const BasicHelp = createAsyncComponent(() => import('./src/BasicHelp.vue'));
6 5 export const BasicTitle = createAsyncComponent(() => import('./src/BasicTitle.vue'));
7   -
8   -withInstall(BasicArrow, BasicHelp, BasicTitle);
... ...
src/components/Button/index.ts
... ... @@ -2,5 +2,4 @@ import Button from './src/BasicButton.vue';
2 2 import { withInstall } from '../util';
3 3  
4 4 withInstall(Button);
5   -
6 5 export { Button };
... ...
src/components/ClickOutSide/index.ts
1 1 import { withInstall } from '../util';
2   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
3 2  
4   -export const ClickOutSide = createAsyncComponent(() => import('./src/index.vue'));
  3 +import ClickOutSide from './src/index.vue';
5 4  
6 5 withInstall(ClickOutSide);
  6 +
  7 +export { ClickOutSide };
... ...
src/components/Container/index.ts
1 1 import { withInstall } from '../util';
2 2 import CollapseContainer from './src/collapse/CollapseContainer.vue';
3   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4   -export const ScrollContainer = createAsyncComponent(() => import('./src/ScrollContainer.vue'));
5   -
6   -// export const CollapseContainer = createAsyncComponent(
7   -// () => import('./src/collapse/CollapseContainer.vue')
8   -// );
9   -export const LazyContainer = createAsyncComponent(() => import('./src/LazyContainer.vue'));
  3 +import ScrollContainer from './src/ScrollContainer.vue';
  4 +import LazyContainer from './src/LazyContainer.vue';
10 5  
11 6 withInstall(ScrollContainer, CollapseContainer, LazyContainer);
12   -
13   -export { CollapseContainer };
  7 +export { CollapseContainer, ScrollContainer, LazyContainer };
14 8 export * from './src/types';
... ...
src/components/CountTo/index.ts
1 1 // Transform vue-count-to to support vue3 version
2 2  
3   -import { withInstall } from '../util';
4   -
5 3 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
6 4 export const CountTo = createAsyncComponent(() => import('./src/index.vue'));
7   -
8   -withInstall(CountTo);
... ...
src/components/Description/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2 export const Description = createAsyncComponent(() => import('./src/index'));
5 3  
6   -withInstall(Description);
7   -
8 4 export * from './src/types';
9 5 export { useDescription } from './src/useDescription';
... ...
src/components/Drawer/index.ts
1 1 import { withInstall } from '../util';
2 2  
3   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4   -export const BasicDrawer = createAsyncComponent(() => import('./src/BasicDrawer'));
  3 +import BasicDrawer from './src/BasicDrawer';
5 4  
6   -withInstall(BasicDrawer);
  5 +export { BasicDrawer };
7 6 export * from './src/types';
8 7 export { useDrawer, useDrawerInner } from './src/useDrawer';
  8 +
  9 +withInstall(BasicDrawer);
... ...
src/components/Dropdown/index.ts
1 1 import { withInstall } from '../util';
2 2  
3   -import Dropdown from './src/Dropdown';
  3 +import Dropdown from './src/Dropdown.vue';
4 4  
5 5 withInstall(Dropdown);
6 6 export * from './src/types';
... ...
src/components/Dropdown/src/Dropdown.tsx deleted 100644 โ†’ 0
1   -import type { Trigger } from './types';
2   -
3   -import { defineComponent, computed, unref } from 'vue';
4   -import { Dropdown, Menu } from 'ant-design-vue';
5   -import Icon from '/@/components/Icon/index';
6   -
7   -import { basicDropdownProps } from './props';
8   -import { getSlot } from '/@/utils/helper/tsxHelper';
9   -
10   -export default defineComponent({
11   - name: 'Dropdown',
12   - props: basicDropdownProps,
13   - emits: ['menuEvent'],
14   - setup(props, { slots, emit, attrs }) {
15   - const getMenuList = computed(() => props.dropMenuList);
16   -
17   - function handleClickMenu({ key }: any) {
18   - const menu = unref(getMenuList).find((item) => `${item.event}` === `${key}`);
19   - emit('menuEvent', menu);
20   - }
21   -
22   - function renderMenus() {
23   - return (
24   - <Menu onClick={handleClickMenu} selectedKeys={props.selectedKeys}>
25   - {() => (
26   - <>
27   - {unref(getMenuList).map((item) => {
28   - const { disabled, icon, text, divider, event } = item;
29   - return [
30   - <Menu.Item key={`${event}`} disabled={disabled}>
31   - {() => (
32   - <>
33   - {icon && <Icon icon={icon} />}
34   - <span class="ml-1">{text}</span>
35   - </>
36   - )}
37   - </Menu.Item>,
38   - // @ts-ignore
39   - divider && <Menu.Divider key={`d-${event}`} />,
40   - ];
41   - })}
42   - </>
43   - )}
44   - </Menu>
45   - );
46   - }
47   -
48   - return () => (
49   - <Dropdown trigger={props.trigger as Trigger[]} {...attrs}>
50   - {{
51   - default: () => <span>{getSlot(slots)}</span>,
52   - overlay: () => renderMenus(),
53   - }}
54   - </Dropdown>
55   - );
56   - },
57   -});
src/components/Dropdown/src/Dropdown.vue 0 โ†’ 100644
  1 +<template>
  2 + <a-dropdown :trigger="trigger" v-bind="$attrs">
  3 + <span>
  4 + <slot />
  5 + </span>
  6 + <template #overlay>
  7 + <a-menu :selectedKeys="selectedKeys">
  8 + <template v-for="item in getMenuList" :key="`${item.event}`">
  9 + <a-menu-item @click="handleClickMenu({ key: item.event })" :disabled="item.disabled">
  10 + <Icon :icon="item.icon" v-if="item.icon" />
  11 + <span class="ml-1">{{ item.text }}</span>
  12 + </a-menu-item>
  13 + <a-menu-divider v-if="item.divider" :key="`d-${item.event}`" />
  14 + </template>
  15 + </a-menu>
  16 + </template>
  17 + </a-dropdown>
  18 +</template>
  19 +
  20 +<script lang="ts">
  21 + import type { PropType } from 'vue';
  22 + import type { DropMenu } from './types';
  23 +
  24 + import { defineComponent, computed, unref } from 'vue';
  25 + import { Dropdown, Menu } from 'ant-design-vue';
  26 + import Icon from '/@/components/Icon/index';
  27 +
  28 + export default defineComponent({
  29 + name: 'BasicDropdown',
  30 + components: {
  31 + [Dropdown.name]: Dropdown,
  32 + [Menu.name]: Menu,
  33 + [Menu.Item.name]: Menu.Item,
  34 + [Menu.Divider.name]: Menu.Divider,
  35 + Icon,
  36 + },
  37 + props: {
  38 + /**
  39 + * the trigger mode which executes the drop-down action
  40 + * @default ['hover']
  41 + * @type string[]
  42 + */
  43 + trigger: {
  44 + type: [Array] as PropType<string[]>,
  45 + default: () => {
  46 + return ['contextmenu'];
  47 + },
  48 + },
  49 + dropMenuList: {
  50 + type: Array as PropType<DropMenu[]>,
  51 + default: () => [],
  52 + },
  53 + selectedKeys: {
  54 + type: Array as PropType<string[]>,
  55 + default: () => [],
  56 + },
  57 + },
  58 + emits: ['menuEvent'],
  59 + setup(props, { emit }) {
  60 + const getMenuList = computed(() => props.dropMenuList);
  61 +
  62 + function handleClickMenu({ key }: { key: string }) {
  63 + const menu = unref(getMenuList).find((item) => `${item.event}` === `${key}`);
  64 + emit('menuEvent', menu);
  65 + }
  66 +
  67 + return { handleClickMenu, getMenuList };
  68 + },
  69 + });
  70 +</script>
... ...
src/components/Dropdown/src/props.ts deleted 100644 โ†’ 0
1   -import type { PropType } from 'vue';
2   -import type { DropMenu } from './types';
3   -
4   -export const dropdownProps = {
5   - /**
6   - * the trigger mode which executes the drop-down action
7   - * @default ['hover']
8   - * @type string[]
9   - */
10   - trigger: {
11   - type: [Array] as PropType<string[]>,
12   - default: () => {
13   - return ['contextmenu'];
14   - },
15   - },
16   -};
17   -export const basicDropdownProps = Object.assign({}, dropdownProps, {
18   - dropMenuList: {
19   - type: Array as PropType<DropMenu[]>,
20   - default: () => [],
21   - },
22   - selectedKeys: {
23   - type: Array as PropType<string[]>,
24   - default: () => [],
25   - },
26   -});
src/components/Dropdown/src/types.ts
... ... @@ -7,4 +7,4 @@ export interface DropMenu {
7 7 divider?: boolean;
8 8 }
9 9  
10   -export type Trigger = 'click' | 'hover' | 'contextMenu';
  10 +// export type Trigger = 'click' | 'hover' | 'contextMenu';
... ...
src/components/Excel/index.ts
1 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
2 2  
3   -import { withInstall } from '../util';
4   -
5 3 export const ImpExcel = createAsyncComponent(() => import('./src/ImportExcel.vue'));
6 4 export const ExpExcelModel = createAsyncComponent(() => import('./src/ExportExcelModel.vue'));
7 5  
8   -withInstall(ImpExcel, ExpExcelModel);
9   -
10 6 export * from './src/types';
11 7  
12 8 export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel';
... ...
src/components/Icon/index.less deleted 100644 โ†’ 0
1   -@import (reference) '../../design/index.less';
2   -
3   -.app-iconify {
4   - display: inline-block;
5   - vertical-align: middle;
6   -}
7   -
8   -span.iconify {
9   - display: block;
10   - min-width: 1em;
11   - min-height: 1em;
12   - background: @iconify-bg-color;
13   - border-radius: 100%;
14   -}
src/components/Icon/index.ts 0 โ†’ 100644
  1 +import { withInstall } from '../util';
  2 +import Icon from './src/index.vue';
  3 +
  4 +withInstall(Icon);
  5 +
  6 +export { Icon };
  7 +export default Icon;
... ...
src/components/Icon/index.tsx renamed to src/components/Icon/src/index.vue
1   -import './index.less';
2   -
3   -import type { PropType } from 'vue';
4   -import {
5   - defineComponent,
6   - ref,
7   - watch,
8   - onMounted,
9   - nextTick,
10   - unref,
11   - computed,
12   - CSSProperties,
13   -} from 'vue';
14   -import Iconify from '@purge-icons/generated';
15   -import { isString } from '/@/utils/is';
16   -import { propTypes } from '/@/utils/propTypes';
17   -export default defineComponent({
18   - name: 'GIcon',
19   - props: {
20   - // icon name
21   - icon: propTypes.string,
22   - // icon color
23   - color: propTypes.string,
24   - // icon size
25   - size: {
26   - type: [String, Number] as PropType<string | number>,
27   - default: 16,
  1 +<template>
  2 + <span ref="elRef" :class="[$attrs.class, 'app-iconify anticon']" :style="getWrapStyle" />
  3 +</template>
  4 +<script lang="ts">
  5 + import type { PropType } from 'vue';
  6 + import {
  7 + defineComponent,
  8 + ref,
  9 + watch,
  10 + onMounted,
  11 + nextTick,
  12 + unref,
  13 + computed,
  14 + CSSProperties,
  15 + } from 'vue';
  16 + import Iconify from '@purge-icons/generated';
  17 + import { isString } from '/@/utils/is';
  18 + import { propTypes } from '/@/utils/propTypes';
  19 + export default defineComponent({
  20 + name: 'GIcon',
  21 + props: {
  22 + // icon name
  23 + icon: propTypes.string,
  24 + // icon color
  25 + color: propTypes.string,
  26 + // icon size
  27 + size: {
  28 + type: [String, Number] as PropType<string | number>,
  29 + default: 16,
  30 + },
  31 + prefix: propTypes.string.def(''),
28 32 },
29   - prefix: propTypes.string.def(''),
30   - },
31   - setup(props, { attrs }) {
32   - const elRef = ref<ElRef>(null);
  33 + setup(props) {
  34 + const elRef = ref<ElRef>(null);
33 35  
34   - const getIconRef = computed(() => {
35   - const { icon, prefix } = props;
36   - return `${prefix ? prefix + ':' : ''}${icon}`;
37   - });
  36 + const getIconRef = computed(() => {
  37 + const { icon, prefix } = props;
  38 + return `${prefix ? prefix + ':' : ''}${icon}`;
  39 + });
38 40  
39   - const update = async () => {
40   - const el = unref(elRef);
41   - if (el) {
42   - await nextTick();
43   - const icon = unref(getIconRef);
  41 + const update = async () => {
  42 + const el = unref(elRef);
  43 + if (el) {
  44 + await nextTick();
  45 + const icon = unref(getIconRef);
44 46  
45   - const svg = Iconify.renderSVG(icon, {});
  47 + const svg = Iconify.renderSVG(icon, {});
46 48  
47   - if (svg) {
48   - el.textContent = '';
49   - el.appendChild(svg);
50   - } else {
51   - const span = document.createElement('span');
52   - span.className = 'iconify';
53   - span.dataset.icon = icon;
54   - el.textContent = '';
55   - el.appendChild(span);
  49 + if (svg) {
  50 + el.textContent = '';
  51 + el.appendChild(svg);
  52 + } else {
  53 + const span = document.createElement('span');
  54 + span.className = 'iconify';
  55 + span.dataset.icon = icon;
  56 + el.textContent = '';
  57 + el.appendChild(span);
  58 + }
56 59 }
57   - }
58   - };
  60 + };
59 61  
60   - const wrapStyleRef = computed(
61   - (): CSSProperties => {
62   - const { size, color } = props;
63   - let fs = size;
64   - if (isString(size)) {
65   - fs = parseInt(size, 10);
  62 + const getWrapStyle = computed(
  63 + (): CSSProperties => {
  64 + const { size, color } = props;
  65 + let fs = size;
  66 + if (isString(size)) {
  67 + fs = parseInt(size, 10);
  68 + }
  69 + return {
  70 + fontSize: `${fs}px`,
  71 + color,
  72 + display: 'inline-flex',
  73 + };
66 74 }
67   - return {
68   - fontSize: `${fs}px`,
69   - color,
70   - display: 'inline-flex',
71   - };
72   - }
73   - );
  75 + );
  76 +
  77 + watch(() => props.icon, update, { flush: 'post' });
74 78  
75   - watch(() => props.icon, update, { flush: 'post' });
  79 + onMounted(update);
  80 +
  81 + return { elRef, getWrapStyle };
  82 + },
  83 + });
  84 +</script>
  85 +<style lang="less">
  86 + @import (reference) '../../../design/index.less';
76 87  
77   - onMounted(update);
  88 + .app-iconify {
  89 + display: inline-block;
  90 + vertical-align: middle;
  91 + }
78 92  
79   - return () => (
80   - <span ref={elRef} class={[attrs.class, 'app-iconify anticon']} style={unref(wrapStyleRef)} />
81   - );
82   - },
83   -});
  93 + span.iconify {
  94 + display: block;
  95 + min-width: 1em;
  96 + min-height: 1em;
  97 + background: @iconify-bg-color;
  98 + border-radius: 100%;
  99 + }
  100 +</style>
... ...
src/components/Loading/index.ts
1   -import './src/indicator';
2   -import { withInstall } from '../util';
3   -
4 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
5 2 export const Loading = createAsyncComponent(() => import('./src/index.vue'));
6 3  
7   -withInstall(Loading);
8 4 export { useLoading } from './src/useLoading';
9 5 export { createLoading } from './src/createLoading';
... ...
src/components/Loading/src/indicator.tsx deleted 100644 โ†’ 0
1   -// If you need to modify the default icon, you can open the comment and modify it here
2   -
3   -// import { Spin } from 'ant-design-vue';
4   -// import { LoadingOutlined } from '@ant-design/icons-vue';
5   -// Spin.setDefaultIndicator({
6   -// indicator: () => {
7   -// return <LoadingOutlined spin />;
8   -// },
9   -// });
src/components/Loading/src/useLoading.ts
... ... @@ -8,6 +8,10 @@ export interface UseLoadingOptions {
8 8 props?: Partial<LoadingProps>;
9 9 }
10 10  
  11 +interface Fn {
  12 + (): void;
  13 +}
  14 +
11 15 export function useLoading(props: Partial<LoadingProps>): [Fn, Fn];
12 16 export function useLoading(opt: Partial<UseLoadingOptions>): [Fn, Fn];
13 17  
... ...
src/components/Markdown/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2 export const MarkDown = createAsyncComponent(() => import('./src/index.vue'));
5 3  
6   -withInstall(MarkDown);
7   -
8 4 export * from './src/types';
... ...
src/components/Markdown/src/index.vue
1 1 <template>
2   - <div class="markdown" ref="wrapRef" />
  2 + <div ref="wrapRef" />
3 3 </template>
4 4 <script lang="ts">
5   - import {
6   - defineComponent,
7   - ref,
8   - onMounted,
9   - unref,
10   - onUnmounted,
11   - nextTick,
12   - // watch,
13   - computed,
14   - } from 'vue';
  5 + import { defineComponent, ref, onMounted, unref, onUnmounted, nextTick, computed } from 'vue';
15 6 import Vditor from 'vditor';
16 7 import 'vditor/dist/index.css';
17 8  
... ... @@ -75,21 +66,6 @@
75 66 initedRef.value = true;
76 67 }
77 68  
78   - // watch(
79   - // () => props.value,
80   - // () => {
81   - // nextTick(() => {
82   - // const vditor = unref(vditorRef);
83   - // if (unref(initedRef) && props.value && vditor) {
84   - // vditor.setValue(props.value);
85   - // }
86   - // });
87   - // },
88   - // {
89   - // immediate: true,
90   - // }
91   - // );
92   -
93 69 onMounted(() => {
94 70 nextTick(() => {
95 71 init();
... ...
src/components/Menu/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2  
5   -export const BasicMenu = createAsyncComponent(() => import('./src/BasicMenu.vue'), {
6   - loading: false,
7   -});
8   -
9   -export const MenuTag = createAsyncComponent(() => import('./src/components/MenuItemTag.vue'), {
10   - loading: false,
11   -});
  3 +export const BasicMenu = createAsyncComponent(() => import('./src/BasicMenu.vue'));
12 4  
13   -withInstall(BasicMenu);
  5 +export const MenuTag = createAsyncComponent(() => import('./src/components/MenuItemTag.vue'));
... ...
src/components/Modal/index.ts
1 1 import './src/index.less';
2 2 import { withInstall } from '../util';
3   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4   -
5   -export const BasicModal = createAsyncComponent(() => import('./src/BasicModal'));
  3 +import BasicModal from './src/BasicModal';
6 4  
7 5 withInstall(BasicModal);
8 6  
  7 +export { BasicModal };
9 8 export { useModalContext } from './src/useModalContext';
10 9 export { useModal, useModalInner } from './src/useModal';
11 10 export * from './src/types';
... ...
src/components/Page/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2 export const PageFooter = createAsyncComponent(() => import('./src/PageFooter.vue'));
5   -
6   -withInstall(PageFooter);
... ...
src/components/Qrcode/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2 export const QrCode = createAsyncComponent(() => import('./src/index.vue'));
5 3  
6   -withInstall(QrCode);
7 4 export * from './src/types';
... ...
src/components/Scrollbar/index.ts
... ... @@ -3,10 +3,9 @@
3 3 */
4 4  
5 5 import { withInstall } from '../util';
6   -
7   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
8   -export const Scrollbar = createAsyncComponent(() => import('./src/index.vue'));
  6 +import Scrollbar from './src/index.vue';
9 7  
10 8 withInstall(Scrollbar);
11 9  
  10 +export { Scrollbar };
12 11 export type { ScrollbarType } from './src/types';
... ...
src/components/StrengthMeter/index.ts 0 โ†’ 100644
  1 +import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
  2 +
  3 +export const StrengthMeter = createAsyncComponent(() => import('./src/index.vue'));
... ...
src/components/StrengthMeter/index.tsx deleted 100644 โ†’ 0
1   -import { withInstall } from '../util';
2   -
3   -import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4   -
5   -export const StrengthMeter = createAsyncComponent(() => import('./src/index'));
6   -
7   -withInstall(StrengthMeter);
src/components/StrengthMeter/src/index.tsx deleted 100644 โ†’ 0
1   -import './index.less';
2   -
3   -import { PropType } from 'vue';
4   -
5   -import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue';
6   -
7   -import { Input } from 'ant-design-vue';
8   -
9   -import zxcvbn from 'zxcvbn';
10   -import { extendSlots } from '/@/utils/helper/tsxHelper';
11   -import { propTypes } from '/@/utils/propTypes';
12   -
13   -const prefixCls = 'strength-meter';
14   -export default defineComponent({
15   - name: 'StrengthMeter',
16   - props: {
17   - value: propTypes.string,
18   -
19   - userInputs: {
20   - type: Array as PropType<string[]>,
21   - default: () => [],
22   - },
23   -
24   - showInput: propTypes.bool.def(true),
25   - disabled: propTypes.bool,
26   - },
27   - emits: ['score-change', 'change'],
28   - setup(props, { emit, attrs, slots }) {
29   - const innerValueRef = ref('');
30   - const getPasswordStrength = computed(() => {
31   - const { userInputs, disabled } = props;
32   - if (disabled) return null;
33   - const innerValue = unref(innerValueRef);
34   - const score = innerValue
35   - ? zxcvbn(unref(innerValueRef), (userInputs as string[]) || null).score
36   - : null;
37   - emit('score-change', score);
38   - return score;
39   - });
40   -
41   - function handleChange(e: ChangeEvent) {
42   - innerValueRef.value = e.target.value;
43   - }
44   -
45   - watchEffect(() => {
46   - innerValueRef.value = props.value || '';
47   - });
48   - watch(
49   - () => unref(innerValueRef),
50   - (val) => {
51   - emit('change', val);
52   - }
53   - );
54   -
55   - return () => {
56   - const { showInput, disabled } = props;
57   - return (
58   - <div class={prefixCls}>
59   - {showInput && (
60   - <Input.Password
61   - {...attrs}
62   - allowClear={true}
63   - value={unref(innerValueRef)}
64   - onChange={handleChange}
65   - disabled={disabled}
66   - >
67   - {extendSlots(slots)}
68   - </Input.Password>
69   - )}
70   - <div class={`${prefixCls}-bar`}>
71   - <div class={`${prefixCls}-bar__fill`} data-score={unref(getPasswordStrength)}></div>
72   - </div>
73   - </div>
74   - );
75   - };
76   - },
77   -});
src/components/StrengthMeter/src/index.less renamed to src/components/StrengthMeter/src/index.vue
1   -@import (reference) '../../../design/index.less';
  1 +<template>
  2 + <div :class="prefixCls">
  3 + <InputPassword
  4 + v-if="showInput"
  5 + v-bind="$attrs"
  6 + allowClear
  7 + :value="innerValueRef"
  8 + @change="handleChange"
  9 + :disabled="disabled"
  10 + >
  11 + <template #[item]="data" v-for="item in Object.keys($slots)">
  12 + <slot :name="item" v-bind="data" />
  13 + </template>
  14 + </InputPassword>
  15 + <div :class="`${prefixCls}-bar`">
  16 + <div :class="`${prefixCls}-bar--fill`" :data-score="getPasswordStrength"></div>
  17 + </div>
  18 + </div>
  19 +</template>
2 20  
3   -.strength-meter {
4   - position: relative;
  21 +<script lang="ts">
  22 + import { PropType } from 'vue';
5 23  
6   - &-bar {
7   - position: relative;
8   - height: 4px;
9   - margin: 10px auto 6px;
10   - background: @disabled-color;
11   - border-radius: 3px;
12   -
13   - &::before,
14   - &::after {
15   - position: absolute;
16   - z-index: 10;
17   - display: block;
18   - width: 20%;
19   - height: inherit;
20   - background: transparent;
21   - border-color: @white;
22   - border-style: solid;
23   - border-width: 0 5px 0 5px;
24   - content: '';
25   - }
  24 + import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue';
26 25  
27   - &::before {
28   - left: 20%;
29   - }
  26 + import { Input } from 'ant-design-vue';
30 27  
31   - &::after {
32   - right: 20%;
33   - }
  28 + import zxcvbn from 'zxcvbn';
  29 + import { propTypes } from '/@/utils/propTypes';
  30 + import { useDesign } from '/@/hooks/web/useDesign';
34 31  
35   - &__fill {
36   - position: absolute;
37   - width: 0;
38   - height: inherit;
39   - background: transparent;
40   - border-radius: inherit;
41   - transition: width 0.5s ease-in-out, background 0.25s;
  32 + export default defineComponent({
  33 + name: 'StrengthMeter',
  34 + components: { InputPassword: Input.Password },
  35 + props: {
  36 + value: propTypes.string,
42 37  
43   - &[data-score='0'] {
44   - width: 20%;
45   - background: darken(@error-color, 10%);
  38 + userInputs: {
  39 + type: Array as PropType<string[]>,
  40 + default: () => [],
  41 + },
  42 +
  43 + showInput: propTypes.bool.def(true),
  44 + disabled: propTypes.bool,
  45 + },
  46 + emits: ['score-change', 'change'],
  47 + setup(props, { emit }) {
  48 + const innerValueRef = ref('');
  49 + const { prefixCls } = useDesign('strength-meter');
  50 +
  51 + const getPasswordStrength = computed(() => {
  52 + const { userInputs, disabled } = props;
  53 + if (disabled) return null;
  54 + const innerValue = unref(innerValueRef);
  55 + const score = innerValue
  56 + ? zxcvbn(unref(innerValueRef), (userInputs as string[]) || null).score
  57 + : null;
  58 + emit('score-change', score);
  59 + return score;
  60 + });
  61 +
  62 + function handleChange(e: ChangeEvent) {
  63 + innerValueRef.value = e.target.value;
46 64 }
47 65  
48   - &[data-score='1'] {
49   - width: 40%;
50   - background: @error-color;
  66 + watchEffect(() => {
  67 + innerValueRef.value = props.value || '';
  68 + });
  69 + watch(
  70 + () => unref(innerValueRef),
  71 + (val) => {
  72 + emit('change', val);
  73 + }
  74 + );
  75 +
  76 + return {
  77 + getPasswordStrength,
  78 + handleChange,
  79 + prefixCls,
  80 + innerValueRef,
  81 + };
  82 + },
  83 + });
  84 +</script>
  85 +<style lang="less" scoped>
  86 + @import (reference) '../../../design/index.less';
  87 + @prefix-cls: ~'@{namespace}-strength-meter';
  88 +
  89 + .@{prefix-cls} {
  90 + position: relative;
  91 +
  92 + &-bar {
  93 + position: relative;
  94 + height: 4px;
  95 + margin: 10px auto 6px;
  96 + background: @disabled-color;
  97 + border-radius: 3px;
  98 +
  99 + &::before,
  100 + &::after {
  101 + position: absolute;
  102 + z-index: 10;
  103 + display: block;
  104 + width: 20%;
  105 + height: inherit;
  106 + background: transparent;
  107 + border-color: @white;
  108 + border-style: solid;
  109 + border-width: 0 5px 0 5px;
  110 + content: '';
51 111 }
52 112  
53   - &[data-score='2'] {
54   - width: 60%;
55   - background: @warning-color;
  113 + &::before {
  114 + left: 20%;
56 115 }
57 116  
58   - &[data-score='3'] {
59   - width: 80%;
60   - background: fade(@success-color, 50%);
  117 + &::after {
  118 + right: 20%;
61 119 }
62 120  
63   - &[data-score='4'] {
64   - width: 100%;
65   - background: @success-color;
  121 + &--fill {
  122 + position: absolute;
  123 + width: 0;
  124 + height: inherit;
  125 + background: transparent;
  126 + border-radius: inherit;
  127 + transition: width 0.5s ease-in-out, background 0.25s;
  128 +
  129 + &[data-score='0'] {
  130 + width: 20%;
  131 + background: darken(@error-color, 10%);
  132 + }
  133 +
  134 + &[data-score='1'] {
  135 + width: 40%;
  136 + background: @error-color;
  137 + }
  138 +
  139 + &[data-score='2'] {
  140 + width: 60%;
  141 + background: @warning-color;
  142 + }
  143 +
  144 + &[data-score='3'] {
  145 + width: 80%;
  146 + background: fade(@success-color, 50%);
  147 + }
  148 +
  149 + &[data-score='4'] {
  150 + width: 100%;
  151 + background: @success-color;
  152 + }
66 153 }
67 154 }
68 155 }
69   -}
  156 +</style>
... ...
src/components/Tinymce/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2 export const Tinymce = createAsyncComponent(() => import('./src/Editor.vue'));
5   -
6   -withInstall(Tinymce);
... ...
src/components/Tree/index.ts
1 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
2   -import { withInstall } from '../util';
3 2  
4 3 export const BasicTree = createAsyncComponent(() => import('./src/BasicTree'));
5 4  
6   -withInstall(BasicTree);
7   -
8 5 export type { ContextMenuItem } from '/@/hooks/web/useContextMenu';
9 6 export * from './src/types';
... ...
src/components/Upload/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2 export const BasicUpload = createAsyncComponent(() => import('./src/BasicUpload.vue'));
5   -
6   -withInstall(BasicUpload);
... ...
src/components/Verify/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2  
5 3 export const BasicDragVerify = createAsyncComponent(() => import('./src/DragVerify'));
6 4 export const RotateDragVerify = createAsyncComponent(() => import('./src/ImgRotate'));
7 5  
8   -withInstall(BasicDragVerify, RotateDragVerify);
9   -
10 6 export * from './src/types';
... ...
src/components/VirtualScroll/index.ts
1   -import { withInstall } from '../util';
2   -
3 1 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
4 2  
5 3 export const VScroll = createAsyncComponent(() => import('./src/index'));
6   -
7   -withInstall(VScroll);
... ...
src/layouts/default/header/index.vue
... ... @@ -84,6 +84,7 @@
84 84 } from './components';
85 85 import { useAppInject } from '/@/hooks/web/useAppInject';
86 86 import { useDesign } from '/@/hooks/web/useDesign';
  87 + import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
87 88  
88 89 export default defineComponent({
89 90 name: 'LayoutHeader',
... ...