简单的Vue异步组件实例Demo


Posted in Javascript onDecember 27, 2017

前言

在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载。为了进一步简化,Vue.js 允许将组件定义为一个工厂函数,异步地解析组件的定义。Vue.js 只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。

为什么需要异步组件,道理和webpack的按需加载是一样的,如果一开始就加载所有的组件,那么是比较耗时的,所以我们可以将一些组件定义为异步组件,在需要使用的时候再进行加载。

所以好处的话就显而易见了 :

  • 按需加载,可以节省首次加载的时间,提高速度,也算是一个性能优化。
  • 那么一个组件可能会被使用多次,按需加载的话也不会加载多次,第一次加载完成就会缓存下来,和webpack是一样的,所以不用担心

最近读Vue文档的时候仔细看了一下异步组件部分,第一次看的时候一脸懵逼,看第二次还是有点迷茫,第三次就有点感觉了,第四次感觉有点明白了,遂记录一下,下面是我写的一个简单Vue异步组件Demo。

实例代码

index.html

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="viewport"
   content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible"
   content="ie=edge">
  <title>Document</title>
  <script>
   // 如果浏览器不支持Promise就加载promise-polyfill
   if ( typeof Promise === 'undefined' ) {
    var script = document.createElement( 'script' );
    script.type = 'text/javascript';
    script.src = 'https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js';
    document.head.appendChild( script );
   }
  </script>
  <!-- 引入Vue -->
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 </head>
 <body>
  <div id="app" style="font-size: 22px">
   <!-- 异步组件async-comp -->
   <async-comp :list="['我是一个异步组件,','如果加载完成,','我就会在这里显示']"></async-comp>
  </div>

  <!-- 引入main.js  -->
  <script src="/main.js"></script>
 </body>
</html>

异步组件Async-Comp.js,

注意,Async-Comp.js并没有在index.html中引用,而是在下面的main.js中动态加载。

window.async_comp = {
 template: '\
  <ol>\
   <li v-for="item in list">{{ item }}</li>\
  </ol>',
 props: {
  list: Array
 }
};

main.js

var vm = new Vue( {
 el: '#app',
 components: {
  /* 异步组件async-comp */
  'async-comp': function () {
   return {
    /** 要渲染的异步组件,必须是一个Promise对象 */
    component: new Promise( function ( resolve, reject ) {
     var script = document.createElement( 'script' );
     script.type = 'text/javascript';
     script.src = '/Async-Comp.js';
     document.head.appendChild( script );
     script.onerror = function () {
      reject( 'load failed!' );
     }

     script.onload = function () {
      if ( typeof async_comp !== 'undefined' )
       resolve( async_comp );
      else reject( 'load failed!' )
     }
    } ),
    /* 加载过程中显示的组件 */
    loading: {
     template: '<p>loading...</p>'
    },
    /* 出现错误时显示的组件 */
    error: {
     template: '\
      <p style="color:red;">load failed!</p>\
     '
    },
    /* loading组件的延迟时间 */
    delay: 10,
    /* 最长等待时间,如果超过此时间,将显示error组件。 */
    timeout:3200
   }
  }
 }
} )

github地址:点击这里

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
用脚本调用样式的几种方法
Dec 09 Javascript
利用jquery包将字符串生成二维码图片
Sep 12 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
Oct 18 Javascript
JS 数字转换研究总结
Dec 26 Javascript
jQuery中append()方法用法实例
Jan 08 Javascript
jquery uploadify隐藏上传进度的实现方法
Feb 06 Javascript
js实现横向拖拽导航条功能
Feb 17 Javascript
几种响应式文字详解
May 19 Javascript
jQuery与vue实现拖动验证码功能
Jan 30 jQuery
Webpack 之 babel-loader文件预处理器详解
Mar 23 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 Javascript
Vue 事件处理操作实例详解
Mar 05 Javascript
Vue.js组件间的循环引用方法示例
Dec 27 #Javascript
全面介绍vue 全家桶和项目实例
Dec 27 #Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 #jQuery
使用jQuery 操作table 完成单元格合并的实例
Dec 27 #jQuery
浅谈vue-router 路由传参的方法
Dec 27 #Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 #Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 #Javascript
You might like
PHP长网址与短网址的实现方法
2017/10/13 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
python写日志封装类实例
2015/06/28 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
幼儿园开学家长寄语
2014/01/19 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
小学安全汇报材料
2014/08/14 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
2014年大学生工作总结
2014/11/20 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
mysql insert 存在即不插入语法说明
2022/03/25 MySQL