fix(脑图): 脑图大数据量模块性能优化

--bug=1046146 --user=白奇 【测试用例】脑图-拖动模块保存时网页崩了 https://www.tapd.cn/55049933/s/1587454
This commit is contained in:
baiqi 2024-09-27 13:57:53 +08:00 committed by Craftsman
parent 39f3b56a2a
commit 2d48e8bb86
2 changed files with 219 additions and 49 deletions

View File

@ -188,6 +188,7 @@
treePath: [],
});
const loading = ref(false);
const largeModulesMap = ref<Record<string, MinderJsonNode[]>>({}); //
const modulesCount = computed(() => caseReviewStore.modulesCount);
@ -195,30 +196,49 @@
* 初始化用例模块树
*/
async function initCaseTree() {
const tree = mapTree<MinderJsonNode>(props.moduleTree, (e) => ({
...e,
data: {
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text.replace(/<\/?p\b[^>]*>/gi, '') || '',
resource: modulesCount.value[e.id] !== undefined ? [moduleTag] : e.data?.resource,
expandState: e.level === 0 ? 'expand' : 'collapse',
count: modulesCount.value[e.id],
disabled: true,
},
children:
modulesCount.value[e.id] > 0 && !e.children?.length
? [
{
data: {
id: 'fakeNode',
text: t('ms.minders.moreCase'),
resource: [''],
const tree = mapTree<MinderJsonNode>(props.moduleTree, (e) => {
if (e.children && e.children.length > 50) {
// 50 50
largeModulesMap.value[e.id] = e.children; //
}
const showingChildren = largeModulesMap.value[e.id]?.splice(0, 50) || e.children || [];
if (showingChildren.length === 50) {
showingChildren.push({
data: {
id: `tmp-${e.id}`,
type: 'tmpModule',
text: t('ms.minders.moreModule'),
resource: [],
isNew: false,
changed: false,
},
});
}
return {
...e,
data: {
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text.replace(/<\/?p\b[^>]*>/gi, '') || '',
resource: modulesCount.value[e.id] !== undefined ? [moduleTag] : e.data?.resource,
expandState: e.level === 0 ? 'expand' : 'collapse',
count: modulesCount.value[e.id],
disabled: true,
},
children:
modulesCount.value[e.id] > 0 && !e.children?.length
? [
{
data: {
id: 'fakeNode',
text: t('ms.minders.moreCase'),
resource: [''],
},
},
},
]
: e.children,
}));
]
: showingChildren,
};
});
importJson.value.root = {
children: tree,
data: {
@ -535,12 +555,77 @@
isReviewer.value = caseReviewerList.value.some((child) => child.userId === userStore.id);
}
function loadMoreModules(id: string) {
const node: MinderJsonNode = window.minder.getNodeById(id);
const children = largeModulesMap.value[id];
if (children) {
const fakeNode = node.children?.find((e) => e.data?.id === `tmp-${id}`); //
if (fakeNode) {
window.minder.removeNode(fakeNode);
}
const waitingRenderNodes: MinderJsonNode[] = [];
children.splice(0, 50).forEach((e) => {
const child = window.minder.createNode(
{
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text || '',
resource: [moduleTag],
expandState: 'collapse',
count: modulesCount.value[e.id],
isNew: false,
changed: false,
},
node
);
if (modulesCount.value[e.id] > 0 && !e.children?.length) {
const fakeChildNode = window.minder.createNode(
{
id: 'fakeNode',
text: t('ms.minders.moreCase'),
resource: [],
isNew: false,
changed: false,
},
child
);
waitingRenderNodes.push(fakeChildNode);
}
waitingRenderNodes.push(child);
});
if (children.length > 0) {
//
const moreNode = window.minder.createNode(
{
id: `tmp-${id}`,
text: t('ms.minders.moreModule'),
type: 'tmpModule',
resource: [],
isNew: false,
changed: false,
},
node
);
waitingRenderNodes.push(moreNode);
}
window.minder.renderNodeBatch(waitingRenderNodes);
node.layout();
// importJson
replaceNodeInTree([importJson.value.root], node.data?.id || '', window.minder.exportNode(node), 'data', 'id');
}
}
/**
* 处理节点选中
* @param node 节点
*/
async function handleNodeSelect(node: MinderJsonNode) {
const { data } = node;
if (data?.type === 'tmpModule') {
//
loadMoreModules(node.parent?.data?.id || '');
return;
}
//
if (data?.type === 'tmp' && node.parent?.data?.resource?.includes(moduleTag)) {
canShowFloatMenu.value = false;

View File

@ -177,6 +177,7 @@
root: {} as MinderJsonNode,
treePath: [],
});
const largeModulesMap = ref<Record<string, MinderJsonNode[]>>({}); //
const caseTree = ref<MinderJsonNode[]>([]);
const loading = ref(false);
const tempMinderParams = ref<FeatureCaseMinderUpdateParams>({
@ -199,33 +200,52 @@
projectId: appStore.currentProjectId,
moduleId: '', //
});
caseTree.value = mapTree<MinderJsonNode>(res, (e) => ({
...e,
data: {
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text || '',
resource: props.modulesCount[e.id] !== undefined ? [moduleTag] : e.data?.resource,
expandState: e.level === 0 ? 'expand' : 'collapse',
count: props.modulesCount[e.id],
isNew: false,
changed: false,
},
children:
props.modulesCount[e.id] > 0 && !e.children?.length
? [
{
data: {
id: 'fakeNode',
text: t('ms.minders.moreCase'),
resource: [''],
isNew: false,
changed: false,
caseTree.value = mapTree<MinderJsonNode>(res, (e) => {
if (e.children && e.children.length > 50) {
// 50 50
largeModulesMap.value[e.id] = e.children; //
}
const showingChildren = largeModulesMap.value[e.id]?.splice(0, 50) || e.children || [];
if (showingChildren.length === 50) {
showingChildren.push({
data: {
id: `tmp-${e.id}`,
type: 'tmpModule',
text: t('ms.minders.moreModule'),
resource: [],
isNew: false,
changed: false,
},
});
}
return {
...e,
data: {
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text || '',
resource: props.modulesCount[e.id] !== undefined ? [moduleTag] : e.data?.resource,
expandState: e.level === 0 ? 'expand' : 'collapse',
count: props.modulesCount[e.id],
isNew: false,
changed: false,
},
children:
props.modulesCount[e.id] > 0 && !e.children?.length
? [
{
data: {
id: 'fakeNode',
text: t('ms.minders.moreCase'),
resource: [],
isNew: false,
changed: false,
},
},
},
]
: e.children,
}));
]
: showingChildren,
};
});
importJson.value.root = {
children: caseTree.value,
data: {
@ -614,6 +634,66 @@
}
}
function loadMoreModules(id: string) {
const node: MinderJsonNode = window.minder.getNodeById(id);
const children = largeModulesMap.value[id];
if (children) {
const fakeNode = node.children?.find((e) => e.data?.id === `tmp-${id}`); //
if (fakeNode) {
window.minder.removeNode(fakeNode);
}
const waitingRenderNodes: MinderJsonNode[] = [];
children.splice(0, 50).forEach((e) => {
const child = window.minder.createNode(
{
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text || '',
resource: [moduleTag],
expandState: 'collapse',
count: props.modulesCount[e.id],
isNew: false,
changed: false,
},
node
);
if (props.modulesCount[e.id] > 0 && !e.children?.length) {
const fakeChildNode = window.minder.createNode(
{
id: 'fakeNode',
text: t('ms.minders.moreCase'),
resource: [],
isNew: false,
changed: false,
},
child
);
waitingRenderNodes.push(fakeChildNode);
}
waitingRenderNodes.push(child);
});
if (children.length > 0) {
//
const moreNode = window.minder.createNode(
{
id: `tmp-${id}`,
type: 'tmpModule',
text: t('ms.minders.moreModule'),
resource: [],
isNew: false,
changed: false,
},
node
);
waitingRenderNodes.push(moreNode);
}
window.minder.renderNodeBatch(waitingRenderNodes);
node.layout();
// importJson
replaceNodeInTree([importJson.value.root], node.data?.id || '', window.minder.exportNode(node), 'data', 'id');
}
}
const showDetailMenu = ref(false);
const canShowEnterNode = ref(false);
/**
@ -623,6 +703,11 @@
async function handleNodeSelect(node: MinderJsonNode) {
const { data } = node;
checkNodeCanShowMenu(node);
if (data?.type === 'tmpModule') {
//
loadMoreModules(node.parent?.data?.id || '');
return;
}
if (data?.type === 'tmp' && node.parent?.data?.resource?.includes(moduleTag)) {
//
await loadMoreCases(node.parent, data.current);