<el-tree v-loading="loading" :props="defaultProps" :load="loadNode" lazy :data="bucketLists" :key="filePathKey" node-key="id" ref="tree" accordion> <span slot-scope="{ node, data }" class="file_list"> <template> <i :class="{ 'el-icon-folder': !node.expanded, // 节点收缩时的图标 'el-icon-folder-opened': node.expanded, // 节点展开时的图标 'el-icon-s-order': data.treeType == 'file', // data.treeType是后端配合提供的识别字段,最后一级 }" style="color: #999" /> <span>{{ data.name }}</span> </template> </span> </el-tree> ,loadNode(node, resolve) { this.query.prefix = node.data.id ? node.data.id : ''; this.nodeid = node.data.id; this.loading = true; this.getBucketFile(node,resolve) }, getBucketFile(node,resolve) { getBucketPreview(this.query).then((res) => { const response = res.data.result.map(item => ({ name: item, id: (node.data.id ? node.data.id : '') + item})); this.loading = false; if (response.length == 10) { this.query.marker = response[response.length - 1].name; resolve(response); this.getBucketFile(resolve); } else { resolve(response); this.loading = false; } }); },这段代码有什么问题
时间: 2023-11-22 16:53:05 浏览: 125
这段代码存在一些问题:
1. 在 loadNode 函数中,如果 getBucketFile 函数中的请求返回结果长度不为 10,则会执行 resolve(response) 和 this.loading = false 两个语句,但是这两个语句的顺序是错误的,应该先将 loading 设为 false,再执行 resolve。因为 resolve 是异步执行的,如果先执行 resolve,可能会导致 loading 还未设为 false 就已经结束了 loading 状态。
2. 在 loadNode 函数中,如果 getBucketFile 函数中的请求返回结果长度不为 10,则会执行 resolve(response) 和 this.loading = false 两个语句,但是在这个情况下,this.loading = false 的语句是多余的,因为已经在 getBucketFile 函数中执行了。
3. 在 loadNode 函数中,如果 getBucketFile 函数中的请求出现异常,则不会将 loading 设为 false,需要在 catch 中添加 this.loading = false 语句。
4. 在 getBucketFile 函数中,如果请求返回结果长度为 10,则会调用 getBucketFile 函数自身,但是这里的调用方式是错误的,应该传入 resolve 而不是 this.getBucketFile(resolve)。
下面是修改后的代码:
```
<el-tree v-loading="loading" :props="defaultProps" :load="loadNode" lazy :data="bucketLists" :key="filePathKey" node-key="id" ref="tree" accordion>
<span slot-scope="{ node, data }" class="file_list">
<template>
<i :class="{ 'el-icon-folder': !node.expanded, 'el-icon-folder-opened': node.expanded, 'el-icon-s-order': data.treeType == 'file' }" style="color: #999" />
<span>{{ data.name }}</span>
</template>
</span>
</el-tree>
loadNode(node, resolve) {
this.query.prefix = node.data.id ? node.data.id : '';
this.nodeid = node.data.id;
this.loading = true;
this.getBucketFile(node, resolve)
},
getBucketFile(node, resolve) {
getBucketPreview(this.query).then((res) => {
const response = res.data.result.map(item => ({ name: item, id: (node.data.id ? node.data.id : '') + item}));
this.loading = false;
if (response.length == 10) {
this.query.marker = response[response.length - 1].name;
this.getBucketFile(node, resolve);
} else {
resolve(response);
}
}).catch(() => {
this.loading = false;
});
},
```
阅读全文