vue问题记录

2019-02-27  本文已影响0人  土豆切成片

关于在组件的局部作用域引入css样式

关于异步路由与异步组件

异步路由
使用异步路由可以根据URL自动加载所需页面的资源, 并且不会造成页面阻塞,较适用于移动端页面, 建议主页面直接import, 非主页可使用异步路由

// 使用方式 : 
{
 path: '/order',
 component: () => import('./views/order.vue')
}

异步组件
不需要首屏加载的组件都可以使用异步组件的方式来加载, 包括需要触发条件的动作也使用异步组件(如弹框), 用v-if来控制显示时机, 引入组件的promise即可
演示:

// 在异步子组件中,mounted 函数中是无法获取到子组件的实例的,所以我们需要对组件异步加载做了一些特殊的控制,
// 其中 import().then() 则是在加载完子组件的 .js 文件后,实例化子组件之前的回调,
// 如果需要处理出错的情况,则 import().then().catch() 即可。
// 以上代码只是注入了一个 created 函数,如果要注入其他生命周期函数,例如 mounted,也是类似的:
<template>
  <div>
    <my-demo ref="demo"></my-demo>
  </div>
</template>

<script>
export default {
  components: {
    MyDemo: () => import('./Demo').then(component => {
      // 清理已缓存的组件定义
      component.default._Ctor = {}

      if (!component.default.attached) {
        // 保存原组件中的 created 生命周期函数
        component.default.backupCreated = component.default.created
        // 保存原组件中的 mounted 生命周期函数
        component.default.backupMounted = component.default.mounted
      }

      // 注入一个特殊的 created 生命周期函数
      component.default.created = function() {
        // 子组件已经实例化完毕

        // this 即为子组件 vm 实例
        console.log(this)

        if (component.default.backupCreated) {
          // 执行原组件中的 created 生命周期函数
          component.default.backupCreated.call(this)
        }
      }
      // 注入一个特殊的 mounted 生命周期函数
      component.default.mounted = function() {
        if (component.default.backupMounted) {
          // 执行原组件中的 mounted 生命周期函数
          component.default.backupMounted.call(this)
        }
      }

      // 表示已经注入过了 
      component.default.attached = true

      return component
    })
  }
}
</script>
上一篇下一篇

猜你喜欢

热点阅读