You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么fancytree懒加载时父级行的自定义样式会被移除?

Fancytree父节点自定义类丢失问题原因及解决方案

问题原因

  • Fancytree内置的节点重绘机制:触发懒加载子节点、展开父节点操作时,Fancytree会自动重绘所有关联父节点的行DOM元素,重绘过程会清空行上所有非Fancytree内置的自定义类,你手动添加的level1/2/3类不属于内置类,会被直接清除。
  • 回调覆盖范围不足:你仅在renderColumns回调中执行了加类逻辑,但renderColumns仅在表格列渲染阶段触发,父节点行被重绘时没有对应的类补充逻辑,原有类自然丢失。

注:你代码里$tdList = $(node.tr)变量名命名不规范,拿的是行元素却命名为tdList,但这不是类丢失的原因,仅建议优化命名。

解决方案

方案1:新增renderNode回调兜底加类逻辑

renderNode是Fancytree每次节点行被创建/重绘时都会触发的回调,在这里执行加类操作,可保证每次重绘后层级类都能被重新添加,代码修改如下:

extensions: ["table"],
table: {
  nodeColumnIdx: 1
},
// 新增renderNode回调,每次行重绘都重新加类
renderNode: function(event, data) {
  renderRow($(data.node.tr), data.node.getLevel());
},
renderColumns: function (event, data) {
  var node = data.node;
  renderRow($(node.tr),node.getLevel());
},

function renderRow($this,level) {
  // 先清除旧层级类,避免类累加错误
  $this.removeClass('level1 level2 level3');
  $this.addClass('level'+(level%3+1));
  // 其余原有逻辑
  ...
}

方案2:使用Fancytree内置的extraClasses属性存储自定义类

Fancytree重绘节点时会自动保留extraClasses属性里的自定义类,直接修改该属性即可避免类被清除,代码修改如下:

extensions: ["table"],
table: {
  nodeColumnIdx: 1
},
renderColumns: function (event, data) {
  var node = data.node;
  var targetLevel = node.getLevel();
  var targetClass = 'level'+(targetLevel%3+1);
  // 避免重复添加类
  if (!node.extraClasses.includes(targetClass)) {
    // 先清除旧的层级类
    node.extraClasses = node.extraClasses.replace(/level[1-3]/g, '').trim();
    node.extraClasses += ' ' + targetClass;
    // 触发重绘让类生效
    node.render();
  }
  renderRow($(node.tr), targetLevel);
},

function renderRow($this,level) {
  // 其余原有逻辑
  ...
}

内容的提问来源于stack exchange,提问作者gordon613

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:57:00