在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。为了简化,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;
欢迎关注。