Vue 组件开发

1. 异步组件

  场景: 项目过大就会导致加载缓慢, 所以异步组件实现按需加载就是必须要做的事了

  (1) 异步加载组件

 1 // 工厂函数执行 resolve 回调
 2 Vue.component('async-webpack-example', function (resolve) {
 3   // 这个特殊的 `require` 语法将会告诉 webpack
 4   // 自动将你的构建代码切割成多个包, 这些包
 5   // 会通过 Ajax 请求加载
 6   require(['./my-async-component'], resolve)
 7 })
 8 
 9 // 工厂函数返回 Promise
10 Vue.component(
11   'async-webpack-example',
12   // 这个 `import` 函数会返回一个 `Promise` 对象。
13   () => import('./my-async-component')
14 )
15 
16 // 工厂函数返回一个配置化组件对象
17 const AsyncComponent = () => ({
18   // 需要加载的组件 (应该是一个 `Promise` 对象)
19   component: import('./MyComponent.vue'),
20   // 异步组件加载时使用的组件
21   loading: LoadingComponent,
22   // 加载失败时使用的组件
23   error: ErrorComponent,
24   // 展示加载时组件的延时时间。默认值是 200 (毫秒)
25   delay: 200,
26   // 如果提供了超时时间且组件加载也超时了,
27   // 则使用加载失败时使用的组件。默认值是:`Infinity`
28   timeout: 3000
29 })

  异步组件的渲染本质其实就是执行2次或者2次以上的渲染,先把当前组件渲染为注释节点, 当组件加载成功后,通过forceRender 执行重新渲染。或者是渲染为注释节点,然后渲染为loading节点,在渲染为请求完成的组件。

   

(2) 路由的按需加载

 1 webpack< 2.4 2 {
 3   path:'/',
 4   name:'home',
 5   components:resolve=>require(['@/components/home'],resolve)
 6 }
 7 
 8 webpack> 2.4 9 {
10   path:'/',
11   name:'home',
12   components:()=>import('@/components/home')
13 }
14 
15 import()方法由es6提出,import()方法是动态加载,返回一个Promise对象,then方法的参数是加载到的模块。
类似于Node.js的require方法,主要import()方法是异步加载的。

 2.动态组件

  场景:做tab切换时就会涉及到组件动态加载

1 <transition>
2 <keep-alive>
3   <component v-bind:is="currentTabComponent"></component>
4 </keep-alive>
5 </transition>

3. 递归组件

   场景:如果开发一个tree组件,里面层级是根据后台数据决定的,这个时候就需要用到递归组件

 1 // 递归组件: 组件在它的模板内可以递归的调用自己,只要给组件设置name组件就可以了。
 2 // 设置那么House在组件模板内就可以递归使用了,不过需要注意的是,
 3 // 必须给一个条件来限制数量,否则会抛出错误: max stack size exceeded
 4 // 组件递归用来开发一些具体有未知层级关系的独立组件。比如:
 5 // 联级选择器和树形控件 
 6 
 7 <template>
 8   <div v-for="(item,index) in treeArr">
 9       子组件,当前层级值: {{index}} <br/>
10       <!-- 递归调用自身, 后台判断是否不存在改值 -->
11       <tree :item="item.arr" v-if="item.flag"></tree>
12   </div>
13 </template>
14 <script>
15 export default {
16   // 必须定义name,组件内部才能递归调用
17   name: 'tree',
18   data(){
19     return {}
20   },
21   // 接收外部传入的值
22   props: {
23      item: {
24       type:Array,
25       default: ()=>[]
26     }
27   }
28 }
29 </script>

 4. 函数式组件

原文地址:https://www.cnblogs.com/shenjilin/p/11673077.html