Intact组件继承
前面已经提过,使用Intact.extend()
方法即可完成组件的继承。
定义父类组件
我们可以将所有页面的公共逻辑放入父类组件,然后子类组件继承它。在这里我们将用户信息模块的逻辑定义在父类组 件中。
var Layout = Intact.extend({
defaults: function() {
return {
show: false
}
},
// 假设父模板编译后的模板函数名为parentTemplate
template: parentTemplate,
_init: function() {
// 用户信息是个通用模块,我们在父类组件获取用户数据
var self = this;
return new Promise(function(resolve) {
setTimeout(function() {
self.set('userName', 'Javey');
}, 100)
});
},
toggleShow: function() {
this.set('show', !this.get('show'))
}
});
继承父类组件
组件可以再被继承,下面我们定义一个子类组件继承上述组件,并扩展它。
var Page = Layout.extend({
template: template,
back: function() {
histroy.back();
}
});
上述扩展,仅仅新增了一个方法back()
,就像所有类的继承一样,我们还可以重载父类的方法。在重载方法里,通过
以下两个方法,可以调用父类的方法:
this._super([...args])
调用父类的同名方法,并且传入参数this._superApply([args])
调用父类的同名方法,并且以数组的形式传入参数
上述两个方法不能在异步函数中调用,如果需要在异步函数中调用,请先用变量将它们保存起来
大多数情况下,每个页面除了父类Layout
中定义的获取用户数据之外,还需要获取页面自己需要的数据。通过上述方法
我们可以很方便做到。
var Page = Layout.extend({
...
_init: function() {
var self = this;
// 注入父模板函数
this.layout = parentTemplate;
return Promise.all([
// 调用父类同名方法_init
this._super(),
new Promise(function(resolve) {
setTimeout(function() {
self.set('data', 'hello')
});
})
]);
}
...
});
至此我们完成了组件的继承,这样每个页面对应的Page
组件,都可以完整控制整个页面的逻辑,并且最大限度地提高了
组件的复用性。