简单的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 相关文章推荐
Javascript 生成指定范围数值随机数
Jan 09 Javascript
Grid得到选择行数据的方法总结
Jan 17 Javascript
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
div模拟选择框示例代码
Nov 03 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
Jun 16 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
JS鼠标滚动分页效果示例
Jul 05 Javascript
JavaScript编写的网页小游戏,很给力
Aug 18 Javascript
如何解决vue2.0下IE浏览器白屏问题
Sep 13 Javascript
vue新建项目并配置标准路由过程解析
Dec 09 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
[原创]图片分页查看
2006/08/28 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
pytorch 模型可视化的例子
2019/08/17 Python
基于python实现文件加密功能
2020/01/06 Python
python 利用zmail库发送邮件
2020/09/11 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
员工教育培训协议书
2014/09/27 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python