异步组件
异步组件是指:组件所需数据是异步加载的。它的渲染策略如下:
- 如果一个异步组件初次渲染,当数据没有加载完成时,会返回一个注释节点作为占位符, 待数据加载完毕后,替换成最终的元素
- 如果用一个异步组件去更新之前的元素,当数据没有加载完成时,会保留当前元素不变, 待数据加载完毕后,替换成最终的元素
异步组件在当你的组件逻辑依赖异步加载的数据时非常有用,因为数据没加载完成,组件 不会渲染,能避免处理数据时,由于数据未定义造成报错。
定义一个异步组件很简单,只需要在组件的_init()
周期函数中返回Promise
对象即可。
var AsyncComponent = Intact.extend({
template: '<div>当前数据为:{self.get("data")}</div>',
_init: function() {
// 模拟接口请求,返回Promise
var self = this;
return new Promise(function(resolve, reject) {
setTimeout(function() {
self.set('data', 'Intact');
resolve();
}, 1000);
});
}
});
var AsyncComponent = self.AsyncComponent;
<div>
<AsyncComponent v-if={self.get('show')} />
<button ev-click={self.set.bind(self, 'show', !self.get('show'))}>
{self.get('show') ? '销毁' : '渲染'}异步组件
</button>
</div>
Intact.extend({
template: template,
_init: function() {
this.AsyncComponent = AsyncComponent;
}
});
可以看到,当渲染组件时,并不会立即渲染,而是等待1s后才渲染。Intact内部会很好地管理 异步组件,所以即使你连续多次点击,它也会被正确地创建和销毁。
将一个异步组件改为同步组件只需一步:去掉
_init()
中关键词return
即可。