Antd Tree树组件 更改样式(节点选中&未选中图标,背景颜色,文字颜色,行高等),自动生成滚动条以及设置滚动条区域的颜色,快速解决简单办法

Antd Tree树组件 更改样式(选中图标,背景颜色,文字颜色,行高等),自动生成滚动条以及设置滚动条区域的颜色,快速解决简单办法

文件结构如下图

eye_close.png为 未选中节点样式(灰色小眼睛图标)
eye_open.png为 选中节点样式(蓝色小眼睛图标)
index.js内部写了Antd树组件
index.module.scss为样式文件,在该文件内壁更改树组件样式
文件结构

代码部分

index.js中的Tree组件部分

<Tree
   checkable
   onExpand={onExpand}
   expandedKeys={expandedKeys}
   autoExpandParent={autoExpandParent}
   onCheck={onCheck}
   checkedKeys={checkedKeys}
   onSelect={onSelect}
   selectedKeys={selectedKeys}
   treeData={treeData}
/>

index.module.scss 样式部分

使用 !important 来防止样式冲突导致样式不生效问题

//树的样式
:global(.ant-tree) {
  background: rgba(30, 35, 64, 0.8) !important;
  color: #00ffff !important;
  font-size: medium !important;
  max-height: 400px !important;
  overflow-y: auto !important;  //自动外显滚动条
}

//滚动条的背景颜色
::-webkit-scrollbar {
  background-color: rgb(55, 81, 119);
}

//滚动条的柱体颜色
::-webkit-scrollbar-thumb {
  background-color: #00ffff;
}
//树节点样式
:global(.ant-tree .ant-tree-treenode) {
  padding: 8px 0 4px 0 !important;
}
//不选中节点样式
:global(.ant-tree-checkbox .ant-tree-checkbox-inner) {
  background-image: url("./eye_close.png") !important;
  background-size: 17px 11px !important;
  background-position: -1px 2px !important;
  background-repeat: no-repeat !important;
  background-color: transparent !important;
  border: 0 !important;
}
//选中节点样式
:global(.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner) {
  background-image: url("./eye_open.png") !important;
  background-size: 17px 11px !important;
  background-position: -1px 2px !important;
  background-repeat: no-repeat !important;
  background-color: transparent !important;
  border: 0 !important;
}
//选中节点样式
:global(.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after) {
  border: 0 !important;
}

效果

在这里插入图片描述

该方法可快速简单有效设置样式
### 解决 Ant Design Tree 组件中子节点取消选择时父节点自动取消选中的问题 在处理 Ant Design 的 `Tree` 组件时,遇到子节点的选择变化影响到父节点的状态是一个常见的需求。为了实现当子节点被取消选择时,父节点也相应地取消选中效果,可以采取监听子节点的变化并手动控制父节点选中状态。 #### 方法一:通过自定义事件处理器来管理父子节点之间的关系 可以通过设置 `onCheck` 属性来自定义勾选逻辑,在此函数内部判断当前操作的是哪个级别的节点,并据此调整其他级别节点的状态: ```javascript const onCheck = (checkedKeys, info) =&gt; { let newCheckedKeys; // 如果是叶子节点,则移除其祖先节点键值;如果是非叶子节点则保持变 if (!info.halfCheckedKeys.includes(info.node.key)) { newCheckedKeys = checkedKeys.filter(key =&gt; !isAncestorOfSelectedNodes(key, checkedKeys)); } else { newCheckedKeys = [...checkedKeys]; } setCheckedKeys(newCheckedKeys); }; // 判断某个key是否为已选中keys集合里的任意项的直系或间接上级 function isAncestorOfSelectedNodes(currentKey, selectedKeys){ for(let i=0;i&lt;selectedKeys.length;i++){ if(selectedKeys[i].indexOf(`${currentKey}/`) === 0 || `${currentKey}/`.indexOf(selectedKeys[i])===0 ){ return true; } } return false; } ``` 上述代码片段展示了如何利用 `onCheck` 回调方法拦截默认为,并根据实际情况更新 `checkedKeys` 来达到预期的效果[^1]。 #### 方法二:使用受控组件的方式完全掌控形结构的选择情况 另一种更灵活的方法就是把整个变成一个受控组件,即由外部显式指定哪些节点应该处于选中状态而是依赖于用户的交互动作去改变这些状态。这样做的好处是可以更加精细地控制每一个节点为模式,包括但限于解决本题提到的问题。 对于这种方法而言,主要工作集中在维护好两个变量&mdash;&mdash;一个是用来保存所有可能被选中节点列表(通常是从服务端获取),另一个是用来记录实际已经被用户标记过的项目集。每当发生任何一次点击或其他形式的操作之后,都需要重新计算这两个数组的内容以确保它们始终保持同步。 ```jsx import React from &#39;react&#39;; import { Tree } from &#39;antd&#39;; class ControlledTree extends React.Component { state = { expandedKeys: [], autoExpandParent: true, checkedKeys: [], // 存储最终要展示出来的选中项 allSelectableItems: [] // 所有可能会被选中的条目 }; render() { const { treeData } = this.props; return ( &lt;&gt; &lt;Tree checkable onCheck={(checkedKeys) =&gt; this.setState({ checkedKeys })} checkedKeys={this.state.checkedKeys} treeData={treeData} /&gt; &lt;/&gt; ); } } export default ControlledTree; ``` 在这个例子中,`checkedKeys` 是唯一决定界面上那些节点呈现为&ldquo;打钩&rdquo;的因素,而再是由内置机制所驱动。因此只要适时修改它的值就可以轻松应对各种复杂的业务场景了[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值