Vue学习笔记(3):组件基础拓展
这节补充一下组件注册和动态组件&异步组件
组件注册
在上一章展示了使用 Vue.component('my-component-name', {...})
进行全局注册。全局注册之后可以用在任何新创建的 Vue 根实例 new Vue()
的模板中。
1 | Vue.component('component-a', { /* ... */ }) |
1 | <div id="app"> |
在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。
局部注册
局部注册的缺点就是使用像webpack这样的构建系统时,就算不需要使用一个组件但是它仍然在构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。
而使用局部注册的方法就是使用 components
属性进行注册:
1 | new Vue({ |
如果通过babel和webpack使用es6的话,可以这样:
1 | import ComponentA from './ComponentA.vue' |
动态组件 & 异步组件
使用 keep-alive
在上一篇的实例:<component v-bind:is="currentComponent"></component>
中,每当切换组件时都会导致组件重新渲染,导致不必要的性能浪费。
使用 <keep-alive>
可以将组件在第一次被创建时缓存下来:
1 | <div id="dynamic-component"> |
注意这个
<keep-alive>
要求被切换到的组件都有自己的名字,不论是通过组件的 name 选项还是局部/全局注册。
异步组件
在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。
一个推荐的做法就是将异步组件和 webpack 的 code-splitting 功能一起配合使用:
1 | Vue.component('async-webpack-example', function (resolve) { |
也可以在工厂函数中返回一个 Promise,所以把 webpack 2 和 ES2015 语法加在一起,可以这样使用动态导入:
1 | Vue.component( |
当使用局部注册的时候,也可以直接提供一个返回 Promise 的函数:
1 | new Vue({ |
处理加载状态
这里的异步组件工厂函数也可以返回一个如下格式的对象:
1 | const AsyncComponent = () => ({ |