模板编程
知道了以上细节,加之Vdt模板本来就支持JS语法,使得我们可以在定义模板时,采用编程的方式更灵活地定义模板。
例如:有一个组件Button
,它既可以返回button
标签,又可以返回a
标签,我们可以如下这么做:
// 根据组件的tag属性,返回不同的标签
// 由于Vdt模板默认返回最后一个标签元素,所以我们必须
// 在模板最后定义一个标签,这里采用宏函数来定义标签
var Button = function(attr) {
// attr === self.get() 返回的是组件的全部属性,我们将不需要
// 作为html元素的tag和children去掉
var props = {};
for (var key in attr.props) {
if (key !== 'tag' && key !== 'children') {
props[key] = attr.props[key];
}
}
return h(attr.props.tag, props, attr.props.children);
};
<Button props={self.get()} />
var Button = Intact.extend({
template: template,
defaults: function() {
return {tag: 'button'}
}
});
var Button = self.Button;
<div>
<Button>button标签</Button>
<Button tag="a">a标签</Button>
</div>
Intact.extend({
template: template,
_init: function() {
this.Button = Button;
}
});