在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。为了简化,Vue 允许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。例如:
如你所见,这个工厂函数会收到一个 resolve 回调,这个回调函数会在你从服务器得到组件定义的时候被调用。你也可以调用 reject(reason) 来表示加载失败。
可以在工厂函数中返回一个 Promise,所以把 webpack 2 和 ES2015 语法加在一起,可以写成这样
当使用局部注册的时候,可以直接提供一个返回 Promise 的函数:
案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>异步渲染</title>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
</head>
<body>
<div id="app">
<component-child></component-child>
</div>
<script>
Vue.component('component-child', function(resolve, reject) {
setTimeout(function() {
resolve({
template: '<div>子组件异步渲染,3秒后把resolve参数返回去</div>'
})
}, 3000)
})
var app = new Vue({
el: '#app',
})
</script>
</body>
</html>
如你所见,3秒之后,resolve( )的参数传递出去,作为component()的第二参数,也就是平常我们注册组件的模式。
有部分同学可能看不懂是什么意思,其实就是:
第二参数最终形态是一个对象,比如obj就是一个对象,obj ={hello:'world' },采用函数写:
var obj = (function(){ return{hello:'world' }})()
上述resolve相当于return。
拓展:同步变成异步的一般方式是什么?
我们需要异步是因为JavaScript是单线程的,异步可以显著改善性能。有哪些异步方式?
右侧绿色部分就是异步方式,比如事件,ajax,定时器等。
异步是一个很重要的课题,
1、延迟类型:setTimeout(setInterval也是可以的)、requestAnimationFrame、setImmediate(IE10及以上)
2、监听事件实现的类型:监听new Image加载状态、监听script加载状态、监听iframe加载状态、Message
3、带有异步功能类型: Promise、ajax( XMLHttpRequest、ActiveXObject)、Worker;
欢迎关注。
