[译]Theia Widget 生命周期

2,033 阅读2分钟

原视频地址: TheiaDevCon 2019: "Life of a Theia Widget"

有兴趣的小伙伴,可以直接看视频

什么是 Widget

具有生命周期钩子的 HTML 元素(视图)

例子说明

export class MyWidget extends BaseWidget {
    static ID = 'myWidget';

    constructor() {
        super();
        this.id = 'my-widget';   // 视图 ID
        this.addClass('my-widget');   // 样式
        this.title.label = 'My Widget Label';
        this.title.caption = 'My Widget caption';   // 鼠标悬浮提示
        this.title.iconClass = 'database-icon';    // 不知为啥没显示
        this.title.closable = true;    // 是否可关闭窗口
    }
}

47.png

widget 生命周期

Instantiation(实例化)

通过 widgetManager 创建的 Widget

Widget ID = Factory ID + Widget Options

image.png

View Contribution

Widget ID = Factory ID (因为 Widget Options 是 undefined)

image.png

Opening URIs

这里 URI 是 Widget Options,所以 Widget ID = Factory ID + URI

image.png

Attaching(添加视图)

视图分为以下几个区域

  • left:左侧视图
  • main:主视图
  • right: 右侧视图
  • bottom:底部视图

image.png

通过 shell.addWidget 添加视图,Widget.detach(widget) 移除

image.png

我们可以在 shell.addWidget 中传入对应的选项,来控制 widget 显示区域等其他属性

image.png

Activation(设置焦点,focus)

首先我们需要了解两个概念

  • active widget:存在焦点元素(focus)的 widget
  • current widget:最后的那个 active widget

image.png

image.png

测试:让我们识别下下面那个是 active widget,那个是 current widget

image.png

答案

  • 没有 active widget,因为 3 个 widget 都没有 focus 状态的元素
  • current widget,最后那个 active widget,也就是 navigator-widget.tsx 对应得那个视图

widget 如果不设置焦点元素的话,我们的页面上就会得到以下这个报错信息

image.png

如果当前的 widget 就是不需要焦点元素的话,则使用 widget.revealWidget 方法添加视图

image.png

Rendering(渲染)

单向数据流

image.png

state

定义 valuevalue change 的回调

image.png

Action

value 改变,就会触发 statevalue change 回调方法,例子中对应执行 widget 中的 update 方法

image.png

View

update 方法,就会触发 ViewonUpdateRequest 中回调,从而更新视图中的数据

image.png

image.png

以下这个是 React 的例子

image.png

Event Handling(事件处理)

image.png

Destruction(销毁)

调用 widget.dispose()

image.png

toDispose 可以理解为当视图销毁时,需要被一同销毁的集合(例如:serviceslistener,也就是数据和监听器,当我们的视图不存在时,这些也就没必要存在了)

image.png

生命周期回调函数

image.png