引子
现代主流前端框架,一般都脱离不开MVVM模型和响应式这两个东西,相信看这篇文章的朋友都接触过。仅就我个人理解,响应式的核心,就是有一个ViewModel分层,去实现MVVM模型中的Model(数据)和View(视图)之间的数据绑定,实现二者的解偶。Model的数据变化可以反应到View视图中,同样,View视图的变化可以反应到Model的数据上。
vscode的事件系统也是响应式编程的体现,他有以下三个核心要点
1.它用在视图 - 模型的数据绑定上
2.它同时用于vscode各个服务之间的消息传递(甚至在后端部分也有应用)
3.它的设计模式基于发布订阅模式
我们今天就分析vscode的事件系统的源码。
例子
我们先看一个vscode源码中的例子,我们点击禁用某个已经激活的插件后,会看到Reload Required
这样的按钮,提示我们需要重新加载窗口(不重新加载插件是无法被禁用的)。当Model层也就是数据层检测到该插件被禁用后,就会通知UI层将按钮标签替换为Reload Required
,这个流程就涉及到vscode的事件系统了
我们先看Model层,这里的Action类通过new Emitter方法生成一个触发器,触发器中有个属性就是event事件,这个事件可以被其他的组件订阅。另外,可以通过this._onDidChange.fire()触发该事件
我们现在不用太去关心原理,只要有个大概印象这里定义了事件,供其他组件订阅;并且能触发事件,通知其他订阅的组件
export class Action extends Disposable implements IAction {
// 定义事件
protected _onDidChange = this._register(new Emitter<IActionChangeEvent>());
readonly onDidChange = this._onDidChange.event;
// 触发事件
private _setLabel(value: string): void {
if (this._label !== value) {
this._label = value;
this._onDidChange.fire({
label: value });
}
}
}
在View层也就是UI层,就有类订阅