当前位置: 首页 > news >正文

代理加盟网站建设公司seo网站关键词排名提升

代理加盟网站建设公司,seo网站关键词排名提升,重庆市建筑一体化平台,在线制作图片纹身前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心。这其中不得不提到 Vue.js 这个专注于 VM 层的框架。 本文主要对 Vue 组件化开发中子组件的异步加载和其生命周期进行一些探讨。阅读本文需要对 Vue 有一…

前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心。这其中不得不提到 Vue.js 这个专注于 VM 层的框架。

本文主要对 Vue 组件化开发中子组件的异步加载和其生命周期进行一些探讨。阅读本文需要对 Vue 有一定的了解。

注意:本文中的例子代码,都是以 vue-cli 采用 webpack 模板初始化的项目为基础。

异步组件

讨论异步加载,需要先了解下异步组件。Vue 的异步组件是把组件定义为一个工厂函数,在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。例如注册一个全局异步组件:

  1. Vue.component('async-demo', function(resolve, reject) {

  2.  setTimeout(function() {

  3.    // 将组件定义传入 resolve 回调函数

  4.    resolve({

  5.      template: '<div>I am async!</div>'

  6.      // 组件的其他选项

  7.    })

  8.  }, 1000)

  9. })

异步子组件和全局注册很类似:

  1. Vue.component('parent-demo', {

  2.  // 父组件的其他选项

  3.  components: {

  4.    'async-demo': function(resolve, reject) {

  5.      setTimeout(function() {

  6.        // 将组件定义传入 resolve 回调函数

  7.        resolve({

  8.          template: '<div>I am async!</div>'

  9.          // 子组件的其他选项

  10.        })

  11.      }, 1000)

  12.    }

  13.  }

  14. })

工厂函数的第一个参数 resolve成功后的回调,第二个参数 reject失败后的回调,可以在这里提示用户加载失败等。

这里使用 setTimeout 只是为了模拟异步,在实际项目中,应该配合 webpack 的代码分离功能来实现异步加载。

异步加载

在实际的项目中,如果不使用异步加载,则 Vue 组件的 JS、CSS 和模板都会打包到一个 .js 文件中,这个文件可能达到几 MB 甚至更多,严重影响首屏加载时间。所以在项目中我们需要启用组件的异步加载。

webpack 代码分离

webpack 的代码分离有两种,第一种,也是优先选择的方式是,使用符合 ECMAScript 提案的 import() 语法。第二种,则是使用 webpack 特定的 require.ensure。让我们先看看第一种:

import() 调用使用会在内部用到 promises。如果在旧有版本浏览器中使用 import(),记得使用一个 polyfill 库(例如 es6-promise 或 promise-polyfill),来 shim Promise。

  1. Vue.component(

  2.  'async-demo',

  3.  // 该 import 函数返回一个 Promise 对象。

  4.  () => import('./async-demo')

  5. )

上面的例子中,前文提到的工厂函数支持返回一个 Promise 对象,所以可以使用 import() 这种代码分离方式。

局部注册也是类似的:

  1. Vue.component('parent-demo', {

  2.  // 父组件的其他选项

  3.  components: {

  4.    'async-demo': () => import('./async-demo')

  5.  }

  6. })

本质上, import() 函数返回一个 Promise 实例,你可以自定义这个过程,下文会有说明。

第二种 webpack 代码分离是这样的:

  1. Vue.component('async-demo', function(resolve) {

  2.  require.ensure([], function(require) {

  3.    resolve(require('./async-demo'))

  4.  }, function(error) {

  5.    // 加载出错执行这里

  6.  })

  7. })

看起来比较繁琐,如果你使用 webpack 2 及以上版本,则不建议使用第二种方式。

生命周期控制

在使用子组件(或者叫局部注册)时,我们可能需要在子组件实例化(或者叫创建完毕)后做某些事情。在非异步的子组件中,我们很容易做这件事:

  1. <template>

  2.  <div>

  3.    <my-demo ref="demo"></my-demo>

  4.  </div>

  5. </template>

  6. <script>

  7. import Demo from './Demo'

  8. export default {

  9.  mounted() {

  10.    // 在这里可以通过组件的 $refs 获取到子组件的实例

  11.    // 可以认为,在这里子组件实例化完毕

  12.    console.log(this.$refs.demo)

  13.  },

  14.  components: {

  15.    MyDemo: Demo

  16.  }

  17. }

  18. </script>

上例中使用了 Vue 的子组件引用,所以可以在生命周期函数 mounted 中很方便的获取到子组件的实例,这样就可以在这个函数中处理一些子组件实例化后要做的事情。

但是在异步子组件中, mounted 函数中是无法获取到子组件的实例的,所以我们需要一些技巧来实现这个功能。

  1. <template>

  2.  <div>

  3.    <my-demo ref="demo"></my-demo>

  4.  </div>

  5. </template>

  6. <script>

  7. export default {

  8.  components: {

  9.    MyDemo: () => import('./Demo').then(component => {

  10.      // 清理已缓存的组件定义

  11.      component.default._Ctor = {}

  12.      if (!component.default.attached) {

  13.        // 保存原组件中的 created 生命周期函数

  14.        component.default.backupCreated = component.default.created

  15.      }

  16.      // 注入一个特殊的 created 生命周期函数

  17.      component.default.created = function() {

  18.        // 子组件已经实例化完毕

  19.        // this 即为子组件 vm 实例

  20.        console.log(this)

  21.        if (component.default.backupCreated) {

  22.          // 执行原组件中的 created 生命周期函数

  23.          component.default.backupCreated.call(this)

  24.        }

  25.      }

  26.      // 表示已经注入过了

  27.      component.default.attached = true

  28.      return component

  29.    })

  30.  }

  31. }

  32. </script>

上例中,可以看到我们对组件异步加载做了一些特殊的控制,其中 import().then() 则是在加载完子组件的 .js 文件后,实例化子组件之前的回调,如果需要处理出错的情况,则 import().then().catch() 即可。

以上代码只是注入了一个 created 函数,如果要注入其他生命周期函数,例如 mounted,也是类似的:

  1. <template>

  2.  <div>

  3.    <my-demo ref="demo"></my-demo>

  4.  </div>

  5. </template>

  6. <script>

  7. export default {

  8.  components: {

  9.    MyDemo: () => import('./Demo').then(component => {

  10.      component.default._Ctor = {}

  11.      if (!component.default.attached) {

  12.        component.default.backupMounted = component.default.mounted

  13.      }

  14.      component.default.mounted = function() {

  15.        if (component.default.backupMounted) {

  16.          component.default.backupMounted.call(this)

  17.        }

  18.      }

  19.      component.default.attached = true

  20.      return component

  21.    })

  22.  }

  23. }

  24. </script>

通过上面的讨论,我们可以做到完全控制 Vue 组件的异步加载的全过程,这对于需要精确控制子组件加载的组件,会有很大的帮助。

演示项目

根据上面的思路,写了一个基于 Bootstrap 的异步弹窗演示项目:

https://github.com/hex-ci/vue-async-bootstrap-modal-demo

http://www.lbrq.cn/news/2669023.html

相关文章:

  • wordpress好玩的主题北京网站优化对策
  • pc网站建设哪个好合肥网站建设程序
  • 大庆市城乡建设局网站青海seo技术培训
  • 网站建设的好处打开免费百度啊
  • 物流网站风格外链发布论坛
  • 做cpa广告网站教程网站开发培训
  • 自助建站程序宁波seo整站优化软件
  • 做网商要创建网站吗中国免费网站服务器2020
  • react是网站开发搜索引擎营销的英文缩写
  • wordpress整站数据转移网站怎么打开
  • 网站建设广州天津seo排名扣费
  • 四川省的住房和城乡建设厅网站首页淄博网站推广
  • 河南那家做网站实力强长沙seo网络推广
  • 哈尔滨搭建网站软件公司
  • 百度联盟 网站备案2345浏览器下载
  • 江西建设厅网站证书查询如何在其他平台做推广
  • 做网站需要知道什么软件运营怎么做
  • dwcs3做网站广州网络推广公司有哪些
  • 廊坊做网站哪家好个人网站免费域名注册
  • 做化工贸易要用那些网站推广关键词优化排名软件怎么样
  • 亚洲男女做暖网站网络营销相关工作岗位
  • php网站模板下载百度集团
  • 网站制作app软件产品推广介绍
  • 网站底部悬浮代码江西百度推广开户多少钱
  • 开发设计移动网站建设下载百度手机助手
  • 梅州做网站需要多少钱二级域名查询入口
  • 做网站哪里需要用钱手机系统优化
  • it网站开发互联网服务平台
  • 温州营销网站公司电话可以搜索国外网站的搜索引擎
  • 网站购买域名app开发流程
  • 【测试报告】SoundWave(Java+Selenium+Jmeter自动化测试)
  • Flutter 与 Android NDK 集成实战:实现高性能原生功能
  • 锂电池SOH预测 | 第35讲 Matlab基于BiLSTM的锂电池健康状态估计(锂电池SOH预测),附锂电池最新文章汇集
  • 使用Navicat备份数据库MySQL、PostGreSQL等
  • 力扣热题100------70.爬楼梯
  • Pytest项目_day10(接口的参数传递)