Vue动态组件&异步组件

在动态组件上使用keep-alive

我们之前曾经在一个多标签的界面中使用is特性来切换不同的组件:


<component v-bind:is="currentTabComponent"></component>

当在这些组件之间切换的时候,你有时会想保持这些组件的状态,以避免反复重渲染导致的性能问题。

如上是vue官网的例子,你会注意到如果你选择一篇文章,切换到Archive标签,然后切回Posts, 是不会继续展示你之前选择的文章的。因为你每次切换新标签的时候,Vue都会创建一个新的currentTabComponent实例。

重新创建动态组件的行为通常是非常有用,但是在这个案例中,我们更希望那些标签的组件实例能够被它们第一次被创建的时候缓存下来,为了解决这个问题,我们可以用一个<keep-alive>元素将其动态组件包裹起来。


//失活的组件将会被缓存
&lt;keep-alive&gt;
    &lt;component v-bind:is="currentTabComponent"&gt;&lt;/component&gt;
&lt;/keep-alive&gt;

异步组件

在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的适合才从服务器加载一个模块。为了简化,Vue允许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue只有在这个组件需要被渲染的时候才会触发该工厂函数,切会把结果缓存起来供未来重渲染:


Vue.component('async-example', funcion(resolve, reject) {
    setTimeout(function() {
        //向resolve回调传递组件定义
        resolve({
            template: '&lt;div&gt;i am async&lt;/div&gt;'
        })
    }, 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语法加在一起,我们可以写成这样:


Vue.component(
    'async-webpack-example',
    () =&gt; import('./my-async-component')
)

当使用局部注册的适合,你也可以直接提供一个返回Promise的函数:


new Vue({
    components: {
        'my-component': () =&gt; import('./my-async-component')
    }
})

处理加载状态 2.3.0新增

这里的异步组件工厂函数也可以返回一个如下格式的对象:


const AsyncComponent = () =&gt; ({
   // 需要加载的组件 (应该是一个 `Promise` 对象)
  component: import('./MyComponent.vue'),
  // 异步组件加载时使用的组件
  loading: LoadingComponent,
  // 加载失败时使用的组件
  error: ErrorComponent,
  // 展示加载时组件的延时时间。默认值是 200 (毫秒)
  delay: 200,
  // 如果提供了超时时间且组件加载也超时了,
  // 则使用加载失败时使用的组件。默认值是:`Infinity`
  timeout: 3000
})

注意如果你希望在 Vue Router 的路由组件中使用上述语法的话,你必须使用 Vue Router 2.4.0+ 版本。

原文地址:https://segmentfault.com/a/1190000016905330

原文地址:https://www.cnblogs.com/lalalagq/p/9916347.html

时间: 2024-08-29 02:21:42

Vue动态组件&异步组件的相关文章

vue -- 动态加载组件

利用component及is占位符即可轻松实现动态切换加载tab栏 语法 <component :is="tabname"></component> 必须是is占位符,不能写别的,通过v-bind指令动态绑定属性 tabname就是我们要显示的组件名称 比如我们创建了三个子组件,并注册到了根组件中:one,two,three 那想要展示哪个子组件,就将组件名赋值给tabname this.tabname = one 原文地址:https://www.cnblog

vue异步组件

路由懒加载 当打包构建应用时,Javascript 包会变得非常大,影响页面加载速度.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载.如: const Foo = () => import('./Foo.vue') 异步组件 在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块.为了简化,Vue 允许你以一个工

vue 异步组件

路由懒加载 当打包构建应用时,Javascript 包会变得非常大,影响页面加载速度.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载.如: 1 const Foo = () => import('./Foo.vue') 异步组件 在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块.为了简化,Vue 允许你以一

Vue动态加载异步组件

背景: 目前我们项目都是按组件划分的,然后各个组件之间封装成产品.目前都是采用iframe直接嵌套页面.项目中我们还是会碰到一些通用的组件跟业务之间有通信,这种情况下iframe并不是最好的选择,iframe存在跨域的问题,当然是postMessage还是可以通信的,但也并非是最好的.目前有这么一个场景:门户需要制作通用的首页和数据概览页面,首页和数据概览页面通过小部件来自由拼接.业务组件在制作的时候只需要提供各个模块小部件的url就可以了,可是如果小部件之间还存在联系呢?那么iframe是不好

vue异步组件和vue.router异步加载

以前在使用angular进行开发时,始终没有处理好异步加载的问题,最多只能使用requirejs异步加载controller里面的内容.导致后来项目扩大的时候,性能问题十分蛋疼.最后我竟然把单页面引用拆成了多页面应用,感觉好囧... 后来尝试用vue写一个项目,配合则webpack,发现效果相当的好.但是vue的异步组件文档太误导人了,让我尝试了好久才发现怎么用.文档上是这样写的: Vue.component('async-webpack-example', function (resolve)

在Java Web Project中实现Vue异步组件加载

背景 最近看上了ElementUI(Vue实现)用来实现一个管理系统Demo,其中一个最常见的需求就是左侧导航不动,右侧主页块在点击导航菜单时动态更新,如下图所示:之前的实现方案是右边嵌入一个iframe,动态更改iframe的url即可,现在既然用了Vue咱也试试单页,是不是显得更优雅.接着就接触到了vue-router.组件.异步组件这些关键字,本以为把页面定义为xxx.vue放到webapp下,然后告诉vue-router去加载就好了,最后发现自己想简单了,思维模式还停留在Java Web

Vue异步组件Demo

Vue异步组件Demo 在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载.为了进一步简化,Vue.js 允许将组件定义为一个工厂函数,异步地解析组件的定义.Vue.js 只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染. 下面是我写的一个简单Vue异步组件Demo. index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="

vue 动态获取路由在对组件进行处理是报错,导致无法进入页面

vue 动态获取路由在对组件进行处理是报错,导致无法进入页面function filterAsyncRouter(asyncRouterMap) { //遍历后台传来的路由字符串,转换为组件对象const accessedRouters = asyncRouterMap.filter(route => { if (route.component) { if (route.component === 'Layout') {//Layout组件特殊处理 route.component = Layou

Vue动态组件

前面的话 让多个组件使用同一个挂载点,并动态切换,这就是动态组件.本文将详细介绍Vue动态组件 概述 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以实现动态组件 <div id="example"> <button @click="change">切换页面</button> <component :is="currentView"></compon