树数据提供器的核心方法有哪些?
结论
TreeDataProvider 最少实现 getTreeItem 和 getChildren。要刷新就暴露 onDidChangeTreeData。要支持 reveal 定位节点,还要实现 getParent。
展开
class Provider implements vscode.TreeDataProvider<Node> {
private emitter = new vscode.EventEmitter<Node | undefined | void>();
readonly onDidChangeTreeData = this.emitter.event;
getTreeItem(element: Node): vscode.TreeItem {
return element;
}
getChildren(element?: Node): Node[] {
if (!element) {
return this.roots();
}
return element.children;
}
getParent(element: Node): Node | undefined {
return element.parent;
}
refresh(node?: Node) {
this.emitter.fire(node);
}
}
getChildren(undefined) 表示根。编辑器不会一次把整棵树要完,而是展开谁再要谁的孩子,所以可以懒加载。
getTreeItem 返回的 TreeItem 决定标签、图标、collapsibleState、command、contextValue、tooltip、description。contextValue 给右键菜单的 viewItem 用。
注册:
vscode.window.registerTreeDataProvider("myext.view", provider);
// 或
vscode.window.createTreeView("myext.view", { treeDataProvider: provider });
需要 reveal、复选框、消息时用 createTreeView,它返回 TreeView。清单里要有对应的 views 贡献,id 对齐。
节点对象的身份要稳定。每次 getChildren 都新建但没有稳定 id 的对象,展开状态和选中会丢。可以用 TreeItem.id。
容易讲错的点
getTreeItem里不要再发网络请求。重活放在getChildren的异步结果里,并做缓存。- 事件发的是「哪个节点脏了」,不是一份新数据。数据要在提供器内部先更新,再
fire。 - 忘记
collapsibleState时,有子节点的项也不会出现展开箭头。