Ant Design Vue的tree树,样式连接线与文本溢出隐藏

 效果图

html代码

 <a-tree
  :treeData="docTree"
 >
        <span slot="title" slot-scope="{ title }">
          <span :title="title">{{ title }}</span>
        </span>
      </a-tree>

CSS代码

@set-color: #7c7c7c;
/deep/.ant-tree-child-tree.ant-tree-child-tree-open > li:first-child {
  padding-top: 4px;
}
.last-menu-line() {
  position: absolute;
  left: 12px;
  width: 1px;
  height: 100%;
  margin: 22px 0 0;
  border-left: 1px dotted @set-color;
  content: ' ';
}
.ant-tree /deep/li {
  position: relative;
  &:before {
    position: absolute;
    left: 12px;
    width: 1px;
    height: 100%;
    height: calc(100% - 45px);
    margin: 22px 0 0;
    border-left: 1px dotted @set-color;
    content: ' ';
  }
  .ant-tree-node-content-wrapper {
    padding: 0;
    width: 90%;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  .ant-tree-child-tree.ant-tree-child-tree-open > li {
    &::after {
      content: '';
      position: absolute;
      width: 8px;
      height: 1px;
      border-top: 1px dotted @set-color;
      background: transparent;
      top: 15.5px;
      left: -5px;
      margin: 0;
    }
    .ant-tree-switcher-noop {
      height: 1px;
      border-top: 1px dotted @set-color;
      top: 11.5px;
      left: 4px;
      margin: 0;
      width: 18px;
      margin-right: 6px;
    }
  }
}

<think>好的,我现在需要解决用户在Vue.js中使用形控件(tree)时,如何实现父级节点不被自动选中的问题。用户提到在类似Ant Design Vue和Element UI中,父节点默认会被选中,但用户希望父节点不可选,只有子节点可以被选中。我需要结合提供的引用资料来找到解决方法。 首先,查看用户提供的引用资料。引用1和引用2讨论了在Tree控件中如何处理父子节点的关联问题。比如,Ant Design Vue中可以通过设置checkStrictly="true"来解除父子关联,但这样会导致父子节点完全独立,用户可能需要在选中子节点时手动处理父节点的状态。引用4提到在使用Tree Select时,父节点默认可选,但用户希望不可选,可能需要通过配置disabled属性或自定义节点样式来实现。 接下来,我需要考虑不同的UI框架,比如Ant Design Vue和Element UI,它们的配置方式可能不同。例如,在Ant Design Vue中,设置checkStrictly为true可以解除关联,但如何让父节点不可选呢?可能需要使用disabled属性,根据节点层级来禁用父节点。而在Element UI中,可能需要使用check-strictly属性,并通过node-key和current-node-key来控制选中状态,或者通过check事件手动处理选中的节点。 然后,我需要思考具体的实现步骤。比如,在Ant Design Vue中,如何遍历节点,为父节点添加disabled属性,或者在选中事件中检查当前节点是否为父节点,如果是则阻止选中。或者,在渲染节点时,通过插槽自定义节点的显示,添加disabled类或隐藏复选框。 还需要考虑用户可能的代码结构,比如使用v-model绑定选中的keys,处理check事件,并在事件回调中过滤掉父节点的key。例如,当用户选中一个节点时,判断该节点是否有子节点,如果有则将其从选中的数组中移除,只保留子节点的keys。 另外,引用3提到在Element UI中,当子节点未全选时,父节点ID不会被包含在getCheckedKeys中。这可能意味着需要手动处理父节点的选中状态,或者在数据源中添加标志位来标识是否为父节点,从而在获取选中结果时排除父节点。 可能的实现方式包括: 1. 使用框架提供的属性解除父子关联,如checkStrictly或check-strictly。 2. 在数据源中为父节点添加disabled属性,使其不可选。 3. 在选中事件中拦截父节点的选择,并更新选中数组。 4. 自定义节点渲染,隐藏父节点的复选框或使其不可点击。 需要验证这些方法的可行性,并参考引用中的示例代码,比如在Ant Design Vue中利用check事件获取当前节点的ID,然后处理其父节点和子节点的选中状态,更新checkedKeys数组。或者在Element UI中使用node的isLeaf属性判断是否为叶子节点,只有叶子节点才能被选中。 最后,总结这些方法,分步骤说明如何在不同的框架中实现父节点不可选的效果,并提供代码示例,如禁用父节点、处理check事件、自定义节点内容等。同时,需要确保回答结构清晰,帮助用户逐步解决问题,并引用相关的资料作为支持。</think>在Vue.js中实现形控件(Tree)的父级节点不自动选中,可通过以下方法解决,具体实现依框架不同有所差异: --- ### 一、Ant Design Vue 实现方案 1. **解除父子关联** 设置属性`checkStrictly="true"`,使父子节点选中状态独立: ```vue <a-tree :checkStrictly="true" @check="onCheck" /> ``` 2. **拦截父节点选中操作** 在`onCheck`事件中,通过判断节点层级过滤父节点: ```javascript onCheck(checkedKeys, { node }) { if (node.children && node.children.length > 0) { // 如果是父节点,则从选中列表中移除 const newKeys = checkedKeys.filter(key => key !== node.eventKey); this.checkedKeys = newKeys; } else { this.checkedKeys = checkedKeys; } } ``` 3. **禁用父节点复选框** 通过`treeData`配置为父节点添加`disabled`属性: ```javascript const treeData = [ { title: &#39;父节点&#39;, key: &#39;parent&#39;, disabled: true, // 禁用复选框 children: [/* 子节点 */] } ]; ``` --- ### 二、Element UI 实现方案 1. **启用独立选中模式** 设置属性`:check-strictly="true"`解除父子关联: ```vue <el-tree :check-strictly="true" @check="onCheck" /> ``` 2. **动态更新选中列表** 在`check`事件中过滤父节点: ```javascript onCheck(currentNode, checkedStatus) { if (currentNode.isLeaf) { // 仅保留叶子节点 this.checkedKeys = checkedStatus.checkedKeys.filter( key => this.leafKeys.includes(key) ); } } ``` 3. **自定义节点渲染** 通过插槽隐藏父节点的复选框: ```vue <el-tree :data="data"> <template #default="{ node }"> <span v-if="node.isLeaf"> <el-checkbox :modelValue="isChecked(node)" /> {{ node.label }} </span> <span v-else>{{ node.label }}</span> </template> </el-tree> ``` --- ### 三、通用逻辑 1. **数据预处理** 遍历数据,为父节点标记`selectable: false`: ```javascript function processTreeData(nodes) { return nodes.map(node => ({ ...node, selectable: !node.children, children: node.children ? processTreeData(node.children) : [] })); } ``` 2. **结合后端过滤** 提交选中结果时,过滤非叶子节点: ```javascript const submitKeys = this.checkedKeys.filter(key => !this.treeData.some(node => node.key === key && node.children) ); ``` --- ### 代码示例(Ant Design Vue) ```vue <template> <a-tree :tree-data="processedTreeData" :checkedKeys="checkedKeys" checkable checkStrictly @check="handleCheck" /> </template> <script> export default { data() { return { rawTreeData: [ { key: &#39;1&#39;, title: &#39;父节点&#39;, children: [ { key: &#39;1-1&#39;, title: &#39;子节点1&#39; }, { key: &#39;1-2&#39;, title: &#39;子节点2&#39; } ]} ], checkedKeys: [] }; }, computed: { processedTreeData() { return this.disableParentNodes(this.rawTreeData); } }, methods: { disableParentNodes(nodes) { return nodes.map(node => ({ ...node, disabled: node.children ? true : false, children: node.children ? this.disableParentNodes(node.children) : [] })); }, handleCheck(checkedKeys, { node }) { if (node.children) { this.checkedKeys = checkedKeys.filter(k => k !== node.key); } else { this.checkedKeys = checkedKeys; } } } }; </script> ``` --- ### 效果验证 - **父节点**:复选框被禁用或选中后自动取消 - **子节点**:正常选中且不影响父节点状态 - **数据提交**:仅包含叶子节点key ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值