From afbcbcec973e94d9953bea4337118f0be911bd28 Mon Sep 17 00:00:00 2001 From: huweihang Date: Wed, 24 Dec 2025 15:42:55 +0800 Subject: [PATCH] =?UTF-8?q?[FIX]=E5=9C=A8=E7=BA=BF=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E5=88=97=E8=A1=A8,=20=E8=AF=BE=E7=A8=8B=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E6=8C=89=E9=92=AE=E4=BD=8D=E7=BD=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9,=20=E8=B5=84=E6=BA=90=E5=BD=92=E5=B1=9E=E4=B8=8B?= =?UTF-8?q?=E7=BA=A7=E9=9D=A2=E6=9D=BF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/course/ManageListRemote.vue | 55 +++++++++++++++++++++------ 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/src/views/course/ManageListRemote.vue b/src/views/course/ManageListRemote.vue index 93e762da..bb2bcfbf 100644 --- a/src/views/course/ManageListRemote.vue +++ b/src/views/course/ManageListRemote.vue @@ -92,6 +92,7 @@ @visible-change="handleResOwnerVisibleChange" filterable :filter-method="resOwnerFilterMethod" + popper-class="my-cascader-popper" >
@@ -1019,10 +1020,43 @@ export default { } }); }, + handleExpand() { + this.$nextTick(() => { + // 找到下拉框DOM + const popper = document.querySelector('.my-cascader-popper') + + const doms = popper.getElementsByClassName('el-cascader-node__label') + Array.from(doms).forEach(label => { + // 使用once选项,确保事件只执行一次 + label.addEventListener('click', (event) => { + console.log('click') + const menus = popper.querySelectorAll('.el-cascader-menu') + if (menus.length > 1) { + // 保留第一个菜单,移除后面的 + for (let i = this.resOwnerSelected.length; i < menus.length; i++) { + menus[i].style.display = 'block' + } + } + // 事件执行后自动解除绑定 + }, { once: true }) + }) + if (popper) { + // 检查是否有多个菜单面板 + const menus = popper.querySelectorAll('.el-cascader-menu') + if (menus.length > 1) { + // 保留第一个菜单,移除后面的 + for (let i = this.resOwnerSelected.length; i < menus.length; i++) { + menus[i].style.display = 'none' + } + } + } + }) + }, // 下拉面板打开时,如果当前没有关键字,也确保是懒加载模式 handleResOwnerVisibleChange(visible) { if (!visible) return; // 如果没有关键字,就强制回到懒加载模式 + this.handleExpand() const keyword = (this.$refs.resOwnerCascader && this.$refs.resOwnerCascader.inputValue) || ''; if (!keyword) { this.resOwnerSearchMode = false; @@ -1647,18 +1681,15 @@ export default { sessionStorage.setItem('courseDetail', JSON.stringify(row)); this.$router.push({ path: '/iframe/course/coursemanage-remote' }); }, - // 克隆一个用于懒加载的节点:只保留当前层必要字段,不预置 children,避免 Element Cascader 出现重复节点 + // 克隆一个用于懒加载的节点:只保留当前层必要字段,不带 children,避免节点被重复追加 cloneOrgNodeForLazy(node = {}) { - const base = { - id: node.id, - name: node.name, - leaf: node.leaf, - }; - // 叶子节点不带 children,避免级联组件显示右侧空面板 - if (!node.leaf && Array.isArray(node.children) && node.children.length > 0) { - base.children = node.children; - } - return base; + const hasChildren = Array.isArray(node.children) && node.children.length > 0; + return { + id: node.id, + name: node.name, + // 明确叶子状态:有子节点则标记为非叶子,让懒加载去取;否则标记为叶子,禁止再展开空面板 + leaf: node.leaf === true ? true : hasChildren ? false : true, + }; }, // 前端“伪懒加载”:根据本地全量机构树按需返回子节点 // 为了让 el-cascader 的 loading 动画有可见效果,这里故意加入一个很小的延时再 resolve @@ -2705,7 +2736,7 @@ export default { border-radius: 6px; border: 1px solid rgba(0, 0, 0, .2); line-height: 32px; - padding: 0 15px 0 10px; + padding-left: 10px; &:focus { border-color: #4284F7; }