提交 2e773916 authored 作者: liuluyu's avatar liuluyu

更新领域加载方式

上级 f13ac2e2
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
import { defHttp } from '/@/utils/http/axios'; import { defHttp } from '/@/utils/http/axios';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
import { useAttrs } from '/@/hooks/core/useAttrs'; import { useAttrs } from '/@/hooks/core/useAttrs';
import { TreeSelect } from 'ant-design-vue';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { isObject, isArray } from '/@/utils/is'; import { isObject, isArray } from '/@/utils/is';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
...@@ -76,6 +75,8 @@ ...@@ -76,6 +75,8 @@
const text = ref<any>(''); const text = ref<any>('');
const code = ref<any>(''); const code = ref<any>('');
const show = ref<boolean>(true); const show = ref<boolean>(true);
const loadingMap = new Map<string, Promise<void>>();
const childrenCache = new Map<string, any[]>();
/** /**
* 监听value数据并初始化 * 监听value数据并初始化
*/ */
...@@ -203,6 +204,8 @@ ...@@ -203,6 +204,8 @@
tableName: unref(tableName), tableName: unref(tableName),
text: unref(text), text: unref(text),
code: unref(code), code: unref(code),
// 若后端支持一次性返回整棵树,可利用该参数减少请求(不支持会忽略)
loadAll: 1,
}; };
let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false }); let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });
if (res.success && res.result) { if (res.success && res.result) {
...@@ -234,12 +237,25 @@ ...@@ -234,12 +237,25 @@
*/ */
async function asyncLoadTreeData(treeNode) { async function asyncLoadTreeData(treeNode) {
if (treeNode.dataRef.children) { if (treeNode.dataRef.children) {
return Promise.resolve(); return;
} }
if (props.url) { if (props.url) {
return Promise.resolve(); return;
}
let pid = String(treeNode.dataRef.key);
if (!pid) return;
const cached = childrenCache.get(pid);
if (cached) {
addChildren(pid, cached, treeData.value);
treeData.value = [...treeData.value];
return;
}
if (loadingMap.has(pid)) {
await loadingMap.get(pid);
return;
} }
let pid = treeNode.dataRef.key;
let params = { let params = {
pid: pid, pid: pid,
pidField: props.pidField, pidField: props.pidField,
...@@ -250,20 +266,30 @@ ...@@ -250,20 +266,30 @@
text: unref(text), text: unref(text),
code: unref(code), code: unref(code),
}; };
let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false }); const p = (async () => {
if (res.success) { try {
for (let i of res.result) { let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });
i.title = translateTitle(i.title); if (res.success) {
i.value = i.key; for (let i of res.result) {
i.isLeaf = !!i.leaf; i.title = translateTitle(i.title);
i.value = i.key;
i.isLeaf = !!i.leaf;
}
// 代码逻辑说明: 【TV360X-87】树表编辑时不可选自己及子孙节点当父节点
handleHiddenNode(res.result);
childrenCache.set(pid, res.result);
//添加子节点
addChildren(pid, res.result, treeData.value);
treeData.value = [...treeData.value];
}
} finally {
loadingMap.delete(pid);
} }
// 代码逻辑说明: 【TV360X-87】树表编辑时不可选自己及子孙节点当父节点 })();
handleHiddenNode(res.result);
//添加子节点 loadingMap.set(pid, p);
addChildren(pid, res.result, treeData.value); await p;
treeData.value = [...treeData.value]; return;
}
return Promise.resolve();
} }
/** /**
...@@ -329,9 +355,9 @@ ...@@ -329,9 +355,9 @@
/** /**
* 校验条件配置是否有误 * 校验条件配置是否有误
*/ */
function validateProp() { function validateProp(): Promise<void> {
let mycondition = props.condition; let mycondition = props.condition;
return new Promise((resolve, reject) => { return new Promise<void>((resolve, reject) => {
if (!mycondition) { if (!mycondition) {
resolve(); resolve();
} else { } else {
...@@ -341,11 +367,11 @@ ...@@ -341,11 +367,11 @@
resolve(); resolve();
} else { } else {
createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!'); createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!');
reject(); reject(new Error('invalid condition'));
} }
} catch (e) { } catch (e) {
createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!'); createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!');
reject(); reject(e as any);
} }
} }
}); });
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
:value="treeValue" :value="treeValue"
:treeData="treeData" :treeData="treeData"
:multiple="multiple" :multiple="multiple"
:loadData="asyncLoadTreeData"
v-bind="attrs" v-bind="attrs"
v-model:searchValue="searchValue" v-model:searchValue="searchValue"
show-search show-search
...@@ -61,6 +62,8 @@ ...@@ -61,6 +62,8 @@
const tableName = ref<any>(''); const tableName = ref<any>('');
const text = ref<any>(''); const text = ref<any>('');
const code = ref<any>(''); const code = ref<any>('');
const loadingMap = new Map<string, Promise<void>>();
const childrenCache = new Map<string, any[]>();
/** /**
* 监听value数据并初始化 * 监听value数据并初始化
*/ */
...@@ -149,14 +152,18 @@ ...@@ -149,14 +152,18 @@
tableName: unref(tableName), tableName: unref(tableName),
text: unref(text), text: unref(text),
code: unref(code), code: unref(code),
// 若后端支持一次性返回整棵树,可利用该参数减少请求(不支持会忽略)
loadAll: 1,
}; };
let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false }); let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });
if (res.success && res.result) { if (res.success && res.result) {
for (let i of res.result) { for (let i of res.result) {
i.value = i.key; i.value = i.key;
if (props.onlyLevel != '1') { // onlyLevel=1:仅展示一级,不允许展开
if (props.onlyLevel == '1') {
i.isLeaf = true;
} else {
i.isLeaf = !!i.leaf; i.isLeaf = !!i.leaf;
loadTreeData(i);
} }
} }
treeData.value = [...res.result]; treeData.value = [...res.result];
...@@ -165,45 +172,35 @@ ...@@ -165,45 +172,35 @@
} }
} }
function loadTreeData(treeNode) {
if (treeNode.children) {
return Promise.resolve();
}
let pid = treeNode.key;
let params = {
pid: pid,
pidField: props.pidField,
hasChildField: props.hasChildField,
converIsLeafVal: props.converIsLeafVal,
condition: props.condition,
tableName: unref(tableName),
text: unref(text),
code: unref(code),
};
defHttp.get({ url: Api.url, params }, { isTransformResponse: false }).then((res) => {
if (res.success) {
for (let i of res.result) {
i.value = i.key;
if (props.onlyLevel != '2') {
i.isLeaf = !!i.leaf;
loadTreeData(i);
}
}
//添加子节点
addChildren(pid, res.result, treeData.value);
treeData.value = [...treeData.value];
}
});
}
/** /**
* 异步加载数据 * 异步加载数据
*/ */
async function asyncLoadTreeData(treeNode) { async function asyncLoadTreeData(treeNode) {
if (treeNode.dataRef.children) { if (treeNode.dataRef.children) {
return Promise.resolve(); return;
} }
let pid = treeNode.dataRef.key; if (props.onlyLevel == '1') {
treeNode.dataRef.isLeaf = true;
return;
}
let pid = String(treeNode.dataRef.key);
if (!pid) return;
// 命中缓存
const cached = childrenCache.get(pid);
if (cached) {
addChildren(pid, cached, treeData.value);
treeData.value = [...treeData.value];
return;
}
// 并发去重
if (loadingMap.has(pid)) {
await loadingMap.get(pid);
return;
}
let params = { let params = {
pid: pid, pid: pid,
pidField: props.pidField, pidField: props.pidField,
...@@ -214,17 +211,28 @@ ...@@ -214,17 +211,28 @@
text: unref(text), text: unref(text),
code: unref(code), code: unref(code),
}; };
let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });
if (res.success) { const p = (async () => {
for (let i of res.result) { try {
i.value = i.key; let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });
i.isLeaf = !!i.leaf; if (res.success) {
for (let i of res.result) {
i.value = i.key;
// onlyLevel=2:只展示到第二级,第二级不允许继续展开
i.isLeaf = props.onlyLevel == '2' ? true : !!i.leaf;
}
childrenCache.set(pid, res.result);
addChildren(pid, res.result, treeData.value);
treeData.value = [...treeData.value];
}
} finally {
loadingMap.delete(pid);
} }
//添加子节点 })();
addChildren(pid, res.result, treeData.value);
treeData.value = [...treeData.value]; loadingMap.set(pid, p);
} await p;
return Promise.resolve(); return;
} }
/** /**
...@@ -275,7 +283,7 @@ ...@@ -275,7 +283,7 @@
/** /**
* 文本框值变化 * 文本框值变化
*/ */
function onSearch(val) { function onSearch(_val) {
// if(!!val){ // if(!!val){
// Object.assign(props,{dict:"st_domain,domain_name,domain_code,domain_name like %'+val+'%"}) // Object.assign(props,{dict:"st_domain,domain_name,domain_code,domain_name like %'+val+'%"})
// } // }
...@@ -284,9 +292,9 @@ ...@@ -284,9 +292,9 @@
/** /**
* 校验条件配置是否有误 * 校验条件配置是否有误
*/ */
function validateProp() { function validateProp(): Promise<void> {
let mycondition = props.condition; let mycondition = props.condition;
return new Promise((resolve, reject) => { return new Promise<void>((resolve, reject) => {
if (!mycondition) { if (!mycondition) {
resolve(); resolve();
} else { } else {
...@@ -296,11 +304,11 @@ ...@@ -296,11 +304,11 @@
resolve(); resolve();
} else { } else {
createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!'); createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!');
reject(); reject(new Error('invalid condition'));
} }
} catch (e) { } catch (e) {
createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!'); createMessage.error('组件JTreeSelect-condition传值有误,需要一个json字符串!');
reject(); reject(e as any);
} }
} }
}); });
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论