el-tree的默认选择节点的样式

废话不多说,直接上需求,如下图所示,当页面加载完成后,要默认选中,第一个节点,以及第一个节点对应的数据。
在这里插入图片描述
思路:在加载完左侧分类树之后,给第一个节点改变class样式,并获得第一个节点的id,请求节点数据,显示在左侧。

html部分代码--------------------------------------------------------

 <el-tree
                        id="column-tree"
                        ref="catalogTree"
                        :data="catalogTableData"
                         :props="defaultProps"
                         highlight-current="true"
                         @node-click="handleNodeClick">
                </el-tree>

js添加默认样式代码:---------------------------------------------------

 //加载当前站点的所有图片分类
        loadCatalogs: function () {
            var teExpandField = Util.jsonParse(userUtil.getSite().teExpandField);
            if (teExpandField && teExpandField.hgphotoApi && teExpandField.hgphotoApi.length > 0) {
                this.btnStatus = true;
            }
            var url = this.api.getCatalogList;
            Util.httpGet(url, function (result) {
                if (result.success) {
                    app.catalogTableData = result.data;
                    console.log("tree======================")
                    console.log(app.catalogTableData);
                    // 判断是否为空
                    if(result.data && result.data.children.length >0 ){
                        app.currentNode = result.data.children[0].data;
                        //默认选中第一个节点
                        app.$nextTick(function () {
                        // 得到这颗树的html:html 代码结构见文章末尾附录
                            var columnTree = document.getElementById("column-tree");
                            console.log(columnTree);
                            // 这里只是自定义一个对象,用来接受这颗树的第一个节点(这个是这颗树的html代码,所以里面有class样式,我们就可以为所欲为了)
                            app.firstSelectedNode = columnTree.childNodes[0];
                            // 添加样式,is前有个空格,一定不要忘记。is-current是elementUI设定的选中时的样式
                            app.firstSelectedNode.className += " is-current";
                            app.defaultNode = result.data.children[0].data;
                            // 请求右侧数据,这代码也要写在 app.$nextTick这个方法内,应为是ajax请求,若
                            // 异步请求。写在该方法外,将会导致 app.$nextTick还没执行完,就执行了handleNodeClick这个方法,但是在handleNodeClick方法内,defaultNode为undifine,所以样式就会出问题,就没有默认样式; 
                            app.handleNodeClick(result.data.children[0]);
                        });
                    }
                }
                else {
                    app.$message(result.message);
                }
            });
        },

js取消默认样式代码---------------------------------------

 /** 左侧图片类型点击事件*/
        handleNodeClick:function (node) {

            app.currentNode = node.data;
            app.modifyCatalogName = app.currentNode.catalogName;

            // 强制取消默认节点的背景色
            // 这里用defaultNode的catalogId 如果与app.currentNode.catalogId不同,则为点击了非默认节点的样式
            // 此时要将默认节点的样式修改掉,否则,默认样式的那个节点一直有样式,你若是点一个节点,那就有2个节点都是被选中的样式了
            if (app.firstSelectedNode && app.defaultNode.catalogId != app.currentNode.catalogId) {
            // 仍然在该函数内,清空样式
                app.$nextTick(function () {
                    app.firstSelectedNode.className = app.firstSelectedNode.className.replace(" is-current", "");
                    app.firstSelectedNode = null;
                });
            }

            // 查询参数
            var query = JSON.parse(JSON.stringify(this.queryParam));
            query.catalogId = node.id;
            if (this.queryParam.beginDate != '' & this.queryParam.beginDate != null) {
                query.beginDate = Util.formatDateObj(this.queryParam.beginDate).substr(0, 10);
            }
            if (this.queryParam.endDate != '' & this.queryParam.endDate != null) {
                query.endDate = Util.formatDateObj(this.queryParam.endDate).substr(0, 10);
                query.endDate += " 23:59:59";
            }

            var url = this.api.getPicGroupList;
            Util.httpGet(url, query, function (result) {
                if (result.success) {
                    for (var i in result.data.rows) {
                        result.data.rows[i].createTime = result.data.rows[i].createTime.substr(5, 11);
                    }
                    app.picRows = result.data.rows;
                    app.pagination.total = result.data.total;
                }
                else {
                    app.$message(result.message);
                }
            });
        },

树的html代码 : 通过document.getElementById(“column-tree”);得到的![在这里插入图片描述]
在这里插入图片描述

firstSelectedNode 的html代码
在这里插入图片描述

<think>好的,我现在需要解决用户关于如何为Element UI的el-tree组件设置当前选中节点的自定义样式的问题。首先,我需要回忆一下Element UI的文档和相关组件属性。 用户提到的是el-tree组件,想要自定义当前选中节点样式。根据之前的经验,Element UI的组件通常允许通过props或者CSS类名来自定义样式。记得el-tree有一个highlight-current属性,当设置为true时,会高亮当前选中的节点。不过默认样式可能不符合用户的需求,所以他们需要自定义。 接下来,我需要确定如何修改样式。通常,在Vue项目中,可以通过Scoped CSS或者全局CSS来覆盖组件样式。但要注意样式穿透的问题,比如使用/deep/或::v-deep来覆盖子组件的样式。用户可能需要修改当前选中节点的背景颜色、文字颜色或者其他样式属性。 然后,查看用户提供的引用内容。引用[1]中提到了使用default-checked-keys来设置默认选中的节点,并且提到改变最底层节点样式。引用[2]则讨论了如何通过CSS隐藏某些复选框,并重新显示子级节点的复选框。这说明用户可能已经尝试过一些CSS方法,但遇到了问题,比如选择器无效的情况。 接下来,我需要确定el-tree当前选中节点对应的CSS类。通常,Element UI的组件会为当前选中的节点添加特定的类名,比如.is-current。通过浏览器的开发者工具检查元素,可以找到具体的类名。例如,当节点被选中时,可能会在节点元素上添加.is-current类,或者.el-tree-node.is-current。 假设选中节点后,该节点的类名为.el-tree-node.is-current,那么可以编写CSS样式来覆盖这个类。例如: .el-tree-node.is-current > .el-tree-node__content { background-color: #f0f7ff; color: #409eff; } 但用户可能需要使用scoped样式,这时候需要使用深度选择器,比如: <style scoped> /deep/ .el-tree-node.is-current > .el-tree-node__content { background-color: #f0f7ff; color: #409eff; } </style> 或者使用::v-deep: <style scoped> ::v-deep .el-tree-node.is-current > .el-tree-node__content { background-color: #f0f7ff; color: #409eff; } </style> 另外,用户可能需要通过JavaScript动态设置样式,比如根据节点的某些属性来应用不同的类。这时可以使用el-tree的node-class-name属性,传入一个函数来动态返回类名。 例如,在组件中定义方法: methods: { customNodeClass({ data }) { if (data.isCurrent) { return 'custom-current-node'; } return ''; } } 然后在CSS中定义.custom-current-node的样式。 不过,需要注意,highlight-current属性需要启用,否则.is-current类可能不会被添加。所以用户需要确保在el-tree组件上设置了highlight-current属性。 总结步骤: 1. 确保el-tree启用highlight-current属性。 2. 使用CSS选择器定位当前选中节点,通常使用.el-tree-node.is-current。 3. 使用深度选择器覆盖样式,特别是在scoped样式中。 4. 可能需要调整其他样式属性,如复选框的位置,参考引用[2]中的方法。 验证时,可能会遇到样式不生效的问题,这通常是因为选择器优先级不够,或者没有正确使用深度选择器。这时候需要检查浏览器开发者工具,查看应用的样式,并调整CSS选择器的优先级。 最后,生成相关问题,帮助用户进一步了解el-tree样式定制和其他相关配置。</think>### Element UI el-tree当前选中节点自定义样式设置方法 要为`el-tree`组件设置当前选中节点的自定义样式,可通过以下步骤实现: --- #### 1. **启用高亮显示** 在组件中启用`highlight-current`属性,确保点击节点时触发高亮状态: ```html <el-tree :data="treeData" highlight-current node-key="id" @node-click="handleNodeClick" ></el-tree> ``` --- #### 2. **通过CSS覆盖默认样式** 使用深度选择器`::v-deep`覆盖Element UI默认样式(适用于Vue Scoped CSS): ```css /* 修改当前选中节点的背景色和文字颜色 */ ::v-deep .el-tree-node.is-current > .el-tree-node__content { background-color: #f0f7ff !important; color: #409eff; font-weight: bold; } /* 调整复选框与文本间距(可选) */ ::v-deep .el-tree-node__content .el-checkbox { margin-right: 8px; } ``` --- #### 3. **动态绑定节点类名(进阶)** 通过`node-class-name`属性动态绑定类名,实现条件样式: ```html <el-tree :data="treeData" :node-class-name="customNodeClass" ></el-tree> ``` ```javascript methods: { customNodeClass({ data }) { return data.isSpecial ? 'special-node' : ''; } } ``` ```css ::v-deep .special-node > .el-tree-node__content { border-left: 3px solid #ff6b6b; } ``` --- #### 注意事项 - **样式穿透**:Vue Scoped CSS需用`::v-deep`或`/deep/`覆盖子组件样式[^2]。 - **优先级问题**:使用`!important`确保自定义样式生效。 - **浏览器检查**:通过开发者工具检查节点类名,确认选择器正确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值