vue3中tree组件懒加载+分页

1、 想实现的效果

两层树形结构,点击父节点后会加载子节点并显示出来,分页
用到的组件:Tree树形控件

2、出现的问题

初始化界面时第一页的数据会重复出现,点击第二页、第三页则正常显示

<el-tree
            :data="projectOptions"
            :props="defaultProps"
            @node-click="handleAttachClick"
            lazy
            :load="loadNode"
          />

onMounted(() => {
  getProAttTree(); // 在组件挂载时调用
});

// 初始化projectOptions

async function getProAttTree(paramss) {
  try {
    const response = await currentProject(queryParams.value);
    if (!Array.isArray(response.rows)) {
      throw new Error("Expected rows to be an array");
    }
    total.value = response.total;
    projectOptions.value = response.rows.map((project) => ({
      ...project,
      children: [],
      isLeaf: false,
    }));
  } catch (error) {
    console.error(error);
    throw error;
  }
}

出现该问题的原因,是因为loadNode方法里本来有个 if (node.level === 0) { } 对父节点进行处理的操作,导致在getProAttTree()方法里被赋值一次,然后又被复制一次
解决方法:删除 if (node.level === 0) { } 这部分,如下:然后调用分页就可以正常调用了

function loadNode(node, resolve) {
  if (node.level === 1) {
    // 懒加载子节点
    setTimeout(() => {
      getFileListByProjectId(node.data.id).then((response) => {
        let data = response.data.map((project) => ({
          ...project,
          children: [],
          isLeaf: true,
          projectName: project.attachmentName,
        }));
        resolve(data);
      });
    }, 1000); // 模拟异步请求
  }
}
### 实现树形结构组件懒加载 #### 在 Vue 中实现树形结构组件懒加载 为了提高性能并减少初始渲染时间,在处理大型树形结构时可以采用懒加载技术。这可以通过按需加载节点的数据来实现。 ```javascript <template> <el-tree :data="treeData" :load="loadNode" lazy></el-tree> </template> <script> export default { data() { return { treeData: [] }; }, methods: { loadNode(node, resolve) { if (node.level === 0) { // 加载根节点数据 setTimeout(() => { resolve([{ name: &#39;Level one&#39; }]); }, 100); } if (node.level > 0) { // 动态加载子节点数据 setTimeout(() => { const children = [ { name: `Child node ${Date.now()}${Math.random()}` } ]; resolve(children); }, 500); } } } }; </script> ``` 此代码片段展示了如何配置`el-tree`组件以支持懒加载功能[^2]。通过设置`:lazy=true`属性以及提供自定义方法`loadNode`用于异步获取子节点列表,当用户展开某个节点时才会触发相应的网络请求或其他形式的数据检索操作。 #### 在 UniApp 中实现树形结构组件懒加载 UniApp框架下同样能够轻松构建具有懒加载特性的树状视图控件: ```html <!-- components/Tree.vue --> <template> <view class="custom-tree"> <block v-for="(item,index) in visibleNodes" :key="index"> <!-- 显示当前层级的内容 --> <text @click="toggle(item)" :class="{expanded:item.expanded}"> {{ item.name }} </text> <!-- 如果该节点已扩展,则显示其下的子项 --> <template v-if="item.expanded && item.children.length>0"> <Tree :visibleNodes="item.children"></Tree> </template> </block> </view> </template> <script> import axios from &#39;axios&#39;; export default { props: [&#39;visibleNodes&#39;], mounted(){ this.fetchInitialData(); }, methods:{ async fetchInitialData(){ try{ let response=await axios.get(&#39;/api/tree/root&#39;); this.$emit(&#39;update:visibleNodes&#39;,response.data); }catch(error){ console.error("Failed to get initial tree data",error); } }, toggle(node){ if (!node.loaded) { this.loadChildren(node); } node.expanded=!node.expanded; }, async loadChildren(parent){ parent.loading=true; try{ let response=await axios.post(`/api/tree/${parent.id}/children`); parent.children=response.data.map(child=>({...child,loaded:false})); parent.loaded=true; }finally{ parent.loading=false; } } } } </script> ``` 这段示例说明了怎样创建一个可复用的树型UI部件,并且实现了懒加载机制。每当点击某一层级上的项目时会调用`toggle()`函数判断是否已经加载过子集;如果没有则发起HTTP GET请求去取得新的条目加入到现有集合当中[^3]。 #### 注意事项 - 对于非常庞大的层次化信息体系来说,除了简单的延迟加载之外还应该考虑其他优化措施如分页、过滤器或是无限滚动等。 - 当涉及到跨域资源访问的时候要确保服务器端做了适当的安全性和权限控制。 - 需要注意的是,上述例子中的API路径仅为示意用途,请根据实际情况调整接口地址和服务端逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值