异步返回的tree展开节点不生效,解决办法原来如此这么简单

用了ant-design-vue的tree,单个控件设置defaultExpandAll为true即可展开所有节点。在小demo里测试一点问题也没有。

<template>
  <a-tree
    :defaultExpandAll="true"
    :tree-data="treeData"
    :replace-fields="{
      children: 'children',
      title: 'title',
      key: 'id',
    }"
  />
</template>

<script>
export default {
  data() {
    return {
      treeData: [{"id":1,"title":"前端","children":[{"id":11,"title":"html"},{"id":12,"title":"css"},{"id":13,"title":"javascript"}]},{"id":2,"title":"后端","children":[{"id":21,"title":"php"},{"id":22,"title":"java"}]}],
    };
  }
};
</script>

然后放进项目,就不能如愿展开,经过一番测试之后,发现是因为treeDate数据是异步返回的。

分析了一下,应该是tree初始化成功,节点正常展开,后来数据再加载进来,也不会再次展开。

于是模拟了一下异步加载:

<template>
  <a-tree
    :expandedKeys="expandedKeys"
    :tree-data="treeData"
    :replace-fields="{
      children: 'children',
      title: 'title',
      key: 'id',
    }"
  />
</template>

<script>
export default {
  data() {
    return {
      treeData: [],
      expandedKeys: [1, 2],
    };
  },
  created(){
    setTimeout(()=>{
      this.treeData = [{"id":1,"title":"前端","children":[{"id":11,"title":"html"},{"id":12,"title":"css"},{"id":13,"title":"javascript"}]},{"id":2,"title":"后端","children":[{"id":21,"title":"php"},{"id":22,"title":"java"}]}];
    },5000);
  },
};
</script>

此时,树节点就没有正常展开。

继续测试,在节点初始化的时候,给树节点一部分数据:

<template>
  <a-tree
    :expandedKeys="expandedKeys"
    :tree-data="treeData"
    :replace-fields="{
      children: 'children',
      title: 'title',
      key: 'id',
    }"
  />
</template>

<script>
export default {
  data() {
    return {
      treeData: [{"id":1,"title":"前端","children":[{"id":11,"title":"html"},{"id":12,"title":"css"},{"id":13,"title":"javascript"}]}],
      expandedKeys: [1, 2],
    };
  },
  created(){
    setTimeout(()=>{
      this.treeData = [{"id":1,"title":"前端","children":[{"id":11,"title":"html"},{"id":12,"title":"css"},{"id":13,"title":"javascript"}]},{"id":2,"title":"后端","children":[{"id":21,"title":"php"},{"id":22,"title":"java"}]}];
    },5000);
  },
};
</script>

结果如图:

 

然后

大概和预想中一样,tree初始化成功,节点正常展开,后来数据再加载进来,也不会再次展开。

那么怎么让异步加载的数据也展开呢?

那么就判断数据加载成功了再初始化tree,就给tree加一个v-if判断就好了!

<template>
  <a-tree
    v-if="treeData.length > 0"
    :expandedKeys="expandedKeys"
    :tree-data="treeData"
    :replace-fields="{
      children: 'children',
      title: 'title',
      key: 'id',
    }"
  />
</template>

<script>
export default {
  data() {
    return {
      treeData: [],
      expandedKeys: [1, 2],
    };
  },
  created(){
    setTimeout(()=>{
      this.treeData = [{"id":1,"title":"前端","children":[{"id":11,"title":"html"},{"id":12,"title":"css"},{"id":13,"title":"javascript"}]},{"id":2,"title":"后端","children":[{"id":21,"title":"php"},{"id":22,"title":"java"}]}];
    },5000);
  },
};
</script>

问题就这样解决啦,如果你有更好的解决办法,欢迎留言谈论哦!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
在Ant Design Vue中的Tree组件中,您可以使用异步加载数据来实现选中父节点展开节点的功能。以下是实现该功能的步骤: 1. 定义Tree节点的数据源,包括节点的id、名称、父节点id等属性。 2. 在Tree组件中设置show-expand属性为true,这将显示展开和折叠图标。 3. 设置Tree组件的load-data属性,指定异步加载数据的方法,该方法将根据父节点id加载子节点数据。 4. 在Tree组件的节点模板中,使用 @click.native 事件监听节点的点击事件,并在事件处理程序中判断当前节点是否有子节点,如果有则展开,否则不展开。 下面是一个示例代码,用于实现选中父节点展开节点的功能: ```html <template> <a-tree :show-expand="true" :load-data="loadData" :tree-data="treeData" > <template slot-scope="{ data }"> <span :class="{'tree-node-disabled': data.disabled}" @click.native="handleClick(data)" > {{ data.title }} </span> </template> </a-tree> </template> <script> export default { data() { return { treeData: [], }; }, mounted() { this.loadData(null, (data) => { this.treeData = data; }); }, methods: { loadData(parent, callback) { // 根据父节点id加载子节点数据 // ... }, handleClick(node) { // 判断当前节点是否有子节点 if (node.children && node.children.length > 0) { // 展开节点 node.expanded = !node.expanded; } }, }, }; </script> ``` 在上面的示例代码中,loadData方法用于异步加载节点数据,handleClick方法用于处理节点的点击事件。当用户单击节点时,如果该节点有子节点,则会展开节点,否则不会展开。请按照您的实际需求进行修改。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程教育的漏网之鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值