咱们以前曾经在一个多标签的界面中使用is特性来切换不一样的组件:vue
<component v-bind:is="currentTabComponent"></component>
当在这些组件之间切换的时候,你有时会想保持这些组件的状态,以免反复重渲染致使的性能问题。webpack
如上是vue官网的例子,你会注意到若是你选择一篇文章,切换到Archive标签,而后切回Posts, 是不会继续展现你以前选择的文章的。由于你每次切换新标签的时候,Vue都会建立一个新的currentTabComponent实例。web
从新建立动态组件的行为一般是很是有用,可是在这个案例中,咱们更但愿那些标签的组件实例可以被它们第一次被建立的时候缓存下来,为了解决这个问题,咱们能够用一个<keep-alive>元素将其动态组件包裹起来。缓存
//失活的组件将会被缓存 <keep-alive> <component v-bind:is="currentTabComponent"></component> </keep-alive>
在大型应用中,咱们可能须要将应用分割成小一些的代码块,而且只在须要的适合才从服务器加载一个模块。为了简化,Vue容许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue只有在这个组件须要被渲染的时候才会触发该工厂函数,切会把结果缓存起来供将来重渲染:服务器
Vue.component('async-example', funcion(resolve, reject) { setTimeout(function() { //向resolve回调传递组件定义 resolve({ template: '<div>i am async</div>' }) }, 1000) })
如你所见,这个工厂函数会收到一个resolve回调,这个回调函数会在你的服务器获得组件定义的时候被调用。你也能够调用reject来表示加载失败。这里的setTimeout是为了演示用,如何获取组件取决于你本身。一个推荐的作法就是将异步组件和webpack的code-slitting功能一块儿配合使用:异步
Vue.component('async-webpack-example', function(resolve) { // 这个特殊的 `require` 语法将会告诉 webpack // 自动将你的构建代码切割成多个包,这些包 // 会经过 Ajax 请求加载 require(['./my-async-component'], resolve) })
你也能够在工厂函数中返回一个Promise,因此把webpack2和ES2015语法加在一块儿,咱们能够写成这样:async
Vue.component( 'async-webpack-example', () => import('./my-async-component') )
当使用局部注册的适合,你也能够直接提供一个返回Promise的函数:函数
new Vue({ components: { 'my-component': () => import('./my-async-component') } })
这里的异步组件工厂函数也能够返回一个以下格式的对象:性能
const AsyncComponent = () => ({ // 须要加载的组件 (应该是一个 `Promise` 对象) component: import('./MyComponent.vue'), // 异步组件加载时使用的组件 loading: LoadingComponent, // 加载失败时使用的组件 error: ErrorComponent, // 展现加载时组件的延时时间。默认值是 200 (毫秒) delay: 200, // 若是提供了超时时间且组件加载也超时了, // 则使用加载失败时使用的组件。默认值是:`Infinity` timeout: 3000 })
注意若是你但愿在 Vue Router 的路由组件中使用上述语法的话,你必须使用 Vue Router 2.4.0+ 版本。ui