From d90cb11fe8edbdc5eee3fa29482c8020833cf23d Mon Sep 17 00:00:00 2001 From: Cano1997 <1978141412@qq.com> Date: Fri, 17 Oct 2025 19:53:22 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=A0=91?= =?UTF-8?q?=E9=83=A8=E4=BB=B6=E6=A0=B7=E5=BC=8F,=E6=A0=91=E5=A4=B4?= =?UTF-8?q?=E9=83=A8=E6=94=B9=E4=B8=BA=E9=9D=A2=E5=8C=85=E5=B1=91=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + src/control/tree/tree.scss | 27 ++++++++++++++++++--------- src/control/tree/tree.tsx | 34 ++++++++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1ddec3da..1ce622217 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ - 数据关系分页布局激活样式适配主题颜色 - 多数据部件项默认绘制及面板绘制时在高度与字体大小上保持一致 - 多数据部件项统一下划线样式,同时移出项上其他下划线样式 +- 优化树部件样式,树头部改为面包屑样式 ### Fixed diff --git a/src/control/tree/tree.scss b/src/control/tree/tree.scss index 39872d10d..16437c429 100644 --- a/src/control/tree/tree.scss +++ b/src/control/tree/tree.scss @@ -1,7 +1,7 @@ $control-treeview: ('text-color': getCssVar('color', 'text'), 'hover-bg-color': getCssVar('color', 'primary'), 'active-bg-color': getCssVar('color', 'primary'), - 'padding': rem(10px), + 'padding': getCssVar(spacing, base), 'bg-color': getCssVar('color', 'bg', 2), ); @@ -9,6 +9,7 @@ $control-treeview-node: ( icon-height: getCssVar(spacing, base), icon-width: getCssVar(spacing, base), icon-margin-right: getCssVar(spacing, tight), + item-height: getCssVar(height, control, large), ); $control-treeview-crumb: ( @@ -33,7 +34,6 @@ $control-treeview-crumb: ( @include set-component-css-var(control-treeview-node, $control-treeview-node); height: 100%; - padding: 0 getCssVar('control-treeview', 'padding'); background: getCssVar('control-treeview', 'bg-color'); } @@ -46,6 +46,7 @@ $control-treeview-crumb: ( .vs-tree-node { position: relative; padding: getCssVar('control-treeview', 'padding'); + height: getCssVar('control-treeview-node', 'item-height'); .vs-tree-inner { display: flex; @@ -72,10 +73,11 @@ $control-treeview-crumb: ( @include b(control-treeview-header) { @include set-component-css-var(control-treeview-node, $control-treeview-node); @include set-component-css-var('control-treeview-crumb', $control-treeview-crumb); + height: getCssVar('height-control', 'large'); + overflow: auto; + white-space: nowrap; + line-height: getCssVar('height-control', 'large'); @include e('crumb') { - display: inline-flex; - align-items: center; - height: getCssVar('height-control', 'small'); .#{bem(icon)} { @include icon; @@ -105,16 +107,22 @@ $control-treeview-crumb: ( // 适配面包屑高度在内容区滚动时始终为0px @include e('container') { height: auto; + padding-bottom: getCssVar(spacing, tight); &>div, .van-sticky { height: auto !important; } - } - - @include when('no-root') { - &>span:has(.#{bem('control-treeview-header__crumb')}.is-root) { + &.is-hidden { display: none; } + &::after { + content: ''; + position: absolute; + width: 100%; + height: getCssVar(spacing, tight); + left: 0; + background-color: getCssVar('color', 'bg', 0); + } } } @@ -123,4 +131,5 @@ $control-treeview-crumb: ( height: 100%; display: flex; flex-direction: column; + padding: getCssVar('control-treeview', 'padding'); } \ No newline at end of file diff --git a/src/control/tree/tree.tsx b/src/control/tree/tree.tsx index bcf475e57..3184b96cb 100644 --- a/src/control/tree/tree.tsx +++ b/src/control/tree/tree.tsx @@ -89,6 +89,9 @@ export const TreeControl = defineComponent({ // 启用面包屑功能 const breadcrumb = ref(true); + // 隐藏显示面包屑 + const hiddenBreadcrumb = ref(false); + // 创建图标节点 const createIconNode = (customProps: IData) => { const iop = vueH(IBizIcon, customProps); @@ -162,6 +165,8 @@ export const TreeControl = defineComponent({ if (treeRef.value) { treeRef.value.tree.tree.store.checkedKeys = checkedKeys.value; treeRef.value.tree.tree.store.setDefaultChecked(); + const list = treeRef.value.tree.tree.store.breadcrumb?.list || []; + hiddenBreadcrumb.value = list.length < 2; } }; @@ -246,11 +251,8 @@ export const TreeControl = defineComponent({ const debounceSearch = debounce(async () => { if (treeRef.value) { // 获取最后展开的节点 - const breadcrumbList = - treeRef.value?.tree?.tree?.store?.breadcrumb?.list; - const breadcrumbListLast = breadcrumbList - ? breadcrumbList[breadcrumbList.length - 1] - : null; + const list = treeRef.value?.tree?.tree?.store?.breadcrumb?.list; + const breadcrumbListLast = list ? list[list.length - 1] : null; if (breadcrumbListLast) { breadcrumbListLast.childNodes = []; treeRef.value?.tree?.tree?.store?.nodesChange([]); @@ -314,14 +316,16 @@ export const TreeControl = defineComponent({ if (c.state.singleSelect) handleSingleSelect(opts); const { originData } = opts; if (!originData._leaf) { + const children = document.createElement('i'); + children.className = 'van-icon van-icon-arrow'; return h('div', { - text: ibiz.i18n.t('control.tree.subordinate'), className: 'tree-button', click: (e: Event, _opts: IData) => { _opts.store.breadcrumb.list.push(_opts); _opts.setExpand(true); handleExpandedLastKey(originData); }, + children: [children], }); } }; @@ -349,6 +353,12 @@ export const TreeControl = defineComponent({ breadcrumb: { el: `#breadcrumb${uuid}`, link: (node: IData, data: IData) => { + const list = node.store?.breadcrumb?.list || []; + if (list.length < 2) { + hiddenBreadcrumb.value = true; + return null; + } + hiddenBreadcrumb.value = false; const content = document.createElement('span'); const textDom = document.createElement('span'); textDom.innerText = data.name; @@ -363,6 +373,7 @@ export const TreeControl = defineComponent({ content.onclick = () => handleExpandedLastKey.bind(this)(data); return content; }, + separator: '>', }, }); } @@ -382,6 +393,7 @@ export const TreeControl = defineComponent({ treeData, options, breadcrumb, + hiddenBreadcrumb, checkedKeys, uuid, treeRef, @@ -414,13 +426,18 @@ export const TreeControl = defineComponent({ slots[key] = () => { const content = [ this.breadcrumb && ( -