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. 函数式组件