提交 2f268ca8 编写于 作者: 陈文彬

fix: fix form,transition,build bug

上级 351f60a8
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
createBreakpointListen(); createBreakpointListen();
const { renderEmpty, transformCellText } = useConfigProvider(); const { renderEmpty, transformCellText } = useConfigProvider();
const { on: lockOn } = useLockPage(); const { on: lockOn } = useLockPage();
return { return {
renderEmpty, renderEmpty,
transformCellText, transformCellText,
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
import { isArray, isBoolean, isFunction, isNumber, isObject, isString } from '/@/utils/is'; import { isArray, isBoolean, isFunction, isNumber, isObject, isString } from '/@/utils/is';
import { cloneDeep } from 'lodash-es'; import { cloneDeep } from 'lodash-es';
import { useBreakpoint } from '/@/hooks/event/useBreakpoint'; import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
import { useThrottle } from '/@/hooks/core/useThrottle'; // import { useThrottle } from '/@/hooks/core/useThrottle';
import { useFormValues } from './hooks/useFormValues'; import { useFormValues } from './hooks/useFormValues';
import type { ColEx } from './types'; import type { ColEx } from './types';
import { NamePath } from 'ant-design-vue/types/form/form-item'; import { NamePath } from 'ant-design-vue/types/form/form-item';
...@@ -163,13 +163,13 @@ ...@@ -163,13 +163,13 @@
}); });
const { realWidthRef, screenEnum, screenRef } = useBreakpoint(); const { realWidthRef, screenEnum, screenRef } = useBreakpoint();
const [throttleUpdateAdvanced] = useThrottle(updateAdvanced, 30, { immediate: true }); // const [throttleUpdateAdvanced] = useThrottle(updateAdvanced, 30, { immediate: true });
watch( watch(
[() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)], [() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)],
() => { () => {
const { showAdvancedButton } = unref(getProps); const { showAdvancedButton } = unref(getProps);
if (showAdvancedButton) { if (showAdvancedButton) {
throttleUpdateAdvanced(); updateAdvanced();
} }
}, },
{ immediate: true } { immediate: true }
......
...@@ -189,14 +189,13 @@ export default defineComponent({ ...@@ -189,14 +189,13 @@ export default defineComponent({
const bindValue = { const bindValue = {
[isCheck ? 'checked' : 'value']: (props.formModel as any)[field], [isCheck ? 'checked' : 'value']: (props.formModel as any)[field],
}; };
if (!renderComponentContent) {
return <Comp {...propsData} {...on} {...bindValue} />;
}
return ( return (
<Comp {...propsData} {...on} {...bindValue}> <Comp {...propsData} {...on} {...bindValue}>
{{ {{
...(renderComponentContent ...renderComponentContent(unref(getValuesRef)),
? renderComponentContent(unref(getValuesRef))
: {
default: () => '',
}),
}} }}
</Comp> </Comp>
); );
......
...@@ -161,6 +161,7 @@ export default defineComponent({ ...@@ -161,6 +161,7 @@ export default defineComponent({
const treeData: any = cloneDeep(unref(treeDataRef)); const treeData: any = cloneDeep(unref(treeDataRef));
if (!parentKey) { if (!parentKey) {
treeData[push](node); treeData[push](node);
treeDataRef.value = treeData;
return; return;
} }
const { key: keyField, children: childrenField } = unref(getReplaceFields); const { key: keyField, children: childrenField } = unref(getReplaceFields);
......
export const MENU_DRAG_STATE = 'MENU_DRAG_STATE';
import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
import {} from 'vue';
import EventHub from '/@/utils/eventHub';
const eventHub = new EventHub();
export function useEventHub(): EventHub {
tryOnUnmounted(() => {
eventHub.clear();
});
return eventHub;
}
...@@ -65,7 +65,7 @@ export default defineComponent({ ...@@ -65,7 +65,7 @@ export default defineComponent({
return () => ( return () => (
<> <>
<Breadcrumb class="layout-breadcrumb"> <Breadcrumb class="layout-breadcrumb flex-grow">
{() => ( {() => (
<> <>
<TransitionGroup name="breadcrumb"> <TransitionGroup name="breadcrumb">
......
...@@ -68,7 +68,7 @@ export default defineComponent({ ...@@ -68,7 +68,7 @@ export default defineComponent({
{showLogo && !isSidebarType && <Logo class={`layout-header__logo`} />} {showLogo && !isSidebarType && <Logo class={`layout-header__logo`} />}
{mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && ( {mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && (
<LayoutBreadcrumb class="flex-grow " /> <LayoutBreadcrumb />
)} )}
{(mode === MenuModeEnum.HORIZONTAL || splitMenu) && ( {(mode === MenuModeEnum.HORIZONTAL || splitMenu) && (
<div class={[`layout-header__menu flex-grow `, `justify-${topMenuAlign}`]}> <div class={[`layout-header__menu flex-grow `, `justify-${topMenuAlign}`]}>
......
...@@ -28,12 +28,15 @@ export function createPageLoadingGuard(router: Router) { ...@@ -28,12 +28,15 @@ export function createPageLoadingGuard(router: Router) {
} }
return true; return true;
}); });
router.afterEach(async () => { router.afterEach(async (to) => {
const { openRouterTransition, openPageLoading } = appStore.getProjectConfig; const { openRouterTransition, openPageLoading } = appStore.getProjectConfig;
if ((!openRouterTransition && openPageLoading) || isFirstLoad) { if ((!openRouterTransition && openPageLoading) || isFirstLoad || to.meta.afterCloseLoading) {
setTimeout(() => {
appStore.commitPageLoadingState(false); appStore.commitPageLoadingState(false);
}, 110);
isFirstLoad = false; isFirstLoad = false;
} }
return true; return true;
}); });
} }
...@@ -27,6 +27,7 @@ export default { ...@@ -27,6 +27,7 @@ export default {
}, },
meta: { meta: {
title: '404', title: '404',
afterCloseLoading: true,
}, },
}, },
{ {
...@@ -38,6 +39,7 @@ export default { ...@@ -38,6 +39,7 @@ export default {
}, },
meta: { meta: {
title: '500', title: '500',
afterCloseLoading: true,
}, },
}, },
{ {
...@@ -49,6 +51,7 @@ export default { ...@@ -49,6 +51,7 @@ export default {
}, },
meta: { meta: {
title: '网络错误', title: '网络错误',
afterCloseLoading: true,
}, },
}, },
{ {
...@@ -60,6 +63,7 @@ export default { ...@@ -60,6 +63,7 @@ export default {
}, },
meta: { meta: {
title: '页面超时', title: '页面超时',
afterCloseLoading: true,
}, },
}, },
{ {
...@@ -71,6 +75,7 @@ export default { ...@@ -71,6 +75,7 @@ export default {
}, },
meta: { meta: {
title: '无数据', title: '无数据',
afterCloseLoading: true,
}, },
}, },
], ],
......
...@@ -26,6 +26,9 @@ export interface RouteMeta { ...@@ -26,6 +26,9 @@ export interface RouteMeta {
// disabled redirect // disabled redirect
disabledRedirect?: boolean; disabledRedirect?: boolean;
// close loading
afterCloseLoading?: boolean;
} }
export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> { export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
......
import { REDIRECT_ROUTE } from './../../router/constant'; import { REDIRECT_ROUTE } from '/@/router/constant';
import type { AppRouteRecordRaw, Menu } from '/@/router/types'; import type { AppRouteRecordRaw, Menu } from '/@/router/types';
import store from '/@/store/index'; import store from '/@/store/index';
import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper'; import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
...@@ -19,7 +19,7 @@ import { genRouteModule, transformObjToRoute } from '/@/utils/helper/routeHelper ...@@ -19,7 +19,7 @@ import { genRouteModule, transformObjToRoute } from '/@/utils/helper/routeHelper
import { transformRouteToMenu } from '/@/utils/helper/menuHelper'; import { transformRouteToMenu } from '/@/utils/helper/menuHelper';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { warn } from 'vue';
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const NAME = 'permission'; const NAME = 'permission';
hotModuleUnregisterModule(NAME); hotModuleUnregisterModule(NAME);
...@@ -107,7 +107,7 @@ class Permission extends VuexModule { ...@@ -107,7 +107,7 @@ class Permission extends VuexModule {
}); });
// this.commitRoutesState(routes); // this.commitRoutesState(routes);
// Background permissions // Background permissions
console.warn( warn(
`当前权限模式为:${PermissionModeEnum.ROLE},请将src/store/modules/permission.ts内的后台菜单获取函数注释,如果已注释可以忽略此信息!` `当前权限模式为:${PermissionModeEnum.ROLE},请将src/store/modules/permission.ts内的后台菜单获取函数注释,如果已注释可以忽略此信息!`
); );
// 如果确定不需要做后台动态权限,请将下面整个判断注释 // 如果确定不需要做后台动态权限,请将下面整个判断注释
......
class EventHub {
private cache: { [key: string]: Array<(data: any) => void> } = {};
on(eventName: string, fn: (data: any) => void) {
this.cache[eventName] = this.cache[eventName] || [];
this.cache[eventName].push(fn);
}
once(eventName: string, fn: (data: any) => void) {
const decor = (...args: any[]) => {
fn && fn.apply(this, args);
this.off(eventName, decor);
};
this.on(eventName, decor);
return this;
}
emit(eventName: string, data?: any) {
if (this.cache[eventName] === undefined) return;
console.log('======================');
console.log(this.cache, eventName);
console.log('======================');
this.cache[eventName].forEach((fn) => fn(data));
}
off(eventName: string, fn: (data: any) => void) {
if (this.cache[eventName] === undefined || this.cache[eventName].length === 0) return;
const i = this.cache[eventName].indexOf(fn);
if (i === -1) return;
this.cache[eventName].splice(i, 1);
}
clear() {
this.cache = {};
}
}
export default EventHub;
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
<BasicForm <BasicForm
:schemas="schemas" :schemas="schemas"
ref="formElRef" ref="formElRef"
:labelWidth="100"
@submit="handleSubmit" @submit="handleSubmit"
:actionColOptions="{ span: 24 }" :actionColOptions="{ span: 24 }"
/> />
......
<script lang="tsx">
import { defineComponent, PropOptions } from 'compatible-vue';
import { BasicModal } from '@/components/modal/index';
import { ErrorInfo } from '@/store/modules/error';
import { Description, useDescription } from '@/components/description/index';
import { getDescSchema } from './data';
export default defineComponent({
name: 'ErrorLogDetailModal',
props: {
info: {
type: Object,
default: null,
} as PropOptions<ErrorInfo>,
},
setup(props, { listeners }) {
const [register] = useDescription({
column: 2,
schema: getDescSchema(),
});
return () => {
return (
<BasicModal width={800} title="错误详情" on={listeners}>
<Description data={props.info} onRegister={register} />
</BasicModal>
);
};
},
});
</script>
import { Tag } from 'ant-design-vue';
import { BasicColumn } from '@/components/table/index';
import { ErrorTypeEnum } from '@/store/modules/error';
import { DescItem } from '@/components/description/index';
export function getColumns(): BasicColumn[] {
return [
{
dataIndex: 'type',
title: '类型',
width: 80,
customRender: (text: string) => {
const color =
text === ErrorTypeEnum.VUE
? 'green'
: text === ErrorTypeEnum.RESOURCE
? 'cyan'
: text === ErrorTypeEnum.PROMISE
? 'blue'
: ErrorTypeEnum.AJAX
? 'red'
: 'purple';
return <Tag color={color}>{text}</Tag>;
},
},
{
dataIndex: 'url',
title: '地址',
width: 200,
},
{
dataIndex: 'time',
title: '时间',
width: 160,
},
{
dataIndex: 'file',
title: '文件',
width: 200,
},
{
dataIndex: 'name',
title: 'Name',
width: 200,
},
{
dataIndex: 'message',
title: '错误信息',
width: 300,
},
{
dataIndex: 'stack',
title: 'stack信息',
width: 300,
},
];
}
export function getDescSchema(): DescItem[] {
return getColumns().map((column) => {
return {
field: column.dataIndex!,
label: column.title,
};
});
}
<script lang="tsx">
import { defineComponent, watch, ref, unref } from 'compatible-vue';
import DetailModal from './DetailModal.vue';
import { useModal } from '@/components/modal/index';
import { useDesign } from '@/hooks/core/useDesign';
import { BasicTable, useTable } from '@/components/table/index';
import { errorStore, ErrorInfo } from '@/store/modules/error';
import { fireErrorApi } from '@/api/demo/error';
import { getColumns } from './data';
const { prefixCls } = useDesign('error-handle');
export default defineComponent({
name: 'ErrorHandler',
setup() {
const rowInfoRef = ref<ErrorInfo>();
const imgListRef = ref<string[]>([]);
const [register, { setTableData }] = useTable({
titleHelpMessage: '只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效!',
title: '错误日志列表',
columns: getColumns(),
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
customRender: (text: string, recoed: ErrorInfo) => {
return (
<a-button type="link" size="small" onClick={handleDetail.bind(null, recoed)}>
详情
</a-button>
);
},
},
});
const [registerModal, { openModal }] = useModal();
watch(
() => errorStore.getErrorInfoState,
(list: any[]) => {
setTableData(list);
},
{
immediate: true,
}
);
// 查看详情
function handleDetail(row: ErrorInfo) {
rowInfoRef.value = row;
openModal({
visible: true,
});
}
function fireVueError() {
throw new Error('fire vue error!');
}
function fireResourceError() {
imgListRef.value.push(`${new Date().getTime()}.png`);
}
async function fireAjaxError() {
await fireErrorApi();
}
return () => (
<div class={[prefixCls, 'p-4']}>
{unref(imgListRef).map((src) => {
return <img src={src} key={src} class="hidden" />;
})}
<DetailModal info={unref(rowInfoRef)} onRegister={registerModal} />
<BasicTable onRegister={register} class={`${prefixCls}-table`}>
<template slot="toolbar">
<a-button onClick={fireVueError} type="primary">
点击触发vue错误
</a-button>
<a-button onClick={fireResourceError} type="primary">
点击触发resource错误
</a-button>
<a-button onClick={fireAjaxError} type="primary">
点击触发ajax错误
</a-button>
</template>
</BasicTable>
</div>
);
},
});
</script>
<style scoped lang="less">
@import (reference) '~@design';
@prefix-cls: ~'@{namespace}-error-handle';
.@{prefix-cls} {
&-table {
background: #fff;
}
}
</style>
<template> <template>
<div class="iframe-page" :style="getWrapStyle"> <div class="iframe-page" :style="getWrapStyle">
<Spin :spinning="loading" size="large" :style="getWrapStyle"> <Spin :spinning="loading" size="large" :style="getWrapStyle">
<div class="iframe-page__mask" v-show="menuStore.getDragStartState" />
<iframe :src="frameSrc" class="iframe-page__main" ref="frameRef" /> <iframe :src="frameSrc" class="iframe-page__main" ref="frameRef" />
</Spin> </Spin>
</div> </div>
...@@ -12,7 +11,7 @@ ...@@ -12,7 +11,7 @@
import { getViewportOffset } from '/@/utils/domUtils'; import { getViewportOffset } from '/@/utils/domUtils';
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize'; import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
import { menuStore } from '/@/store/modules/menu';
export default defineComponent({ export default defineComponent({
name: 'IFrame', name: 'IFrame',
components: { Spin }, components: { Spin },
...@@ -76,7 +75,6 @@ ...@@ -76,7 +75,6 @@
}), }),
loading: loadingRef, loading: loadingRef,
frameRef, frameRef,
menuStore,
}; };
}, },
}); });
......
...@@ -51,7 +51,7 @@ const viteConfig: UserConfig = { ...@@ -51,7 +51,7 @@ const viteConfig: UserConfig = {
*/ */
port: 3100, port: 3100,
/** /**
* 运行自动打开浏览器 * 运行自动打开浏览器·
* @default 'false' * @default 'false'
*/ */
open: false, open: false,
...@@ -88,9 +88,9 @@ const viteConfig: UserConfig = { ...@@ -88,9 +88,9 @@ const viteConfig: UserConfig = {
assetsInlineLimit: 4096, assetsInlineLimit: 4096,
/** /**
* esbuild转换目标。 * esbuild转换目标。
* @default 'es2020' * @default 'es2019'
*/ */
esbuildTarget: 'es2020', esbuildTarget: 'es2019',
// 别名 // 别名
alias: { alias: {
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册