vue动态子组件的实现方式

让多个组件使用同一个挂载点,并动态切换,这就是动态组件。

通过使用保留的 <component>元素,动态地绑定到它的 is 特性,可以实现动态组件。

方式一:局部注册所需组件

<div id="example">
  button @click="change">切换页面</buttoncomponent :is="currentView"></component>
div>
script>
var home = {template:'<div>我是主页</div>};
 post <div>我是提交页</div> archive <div>我是存档页</div>new Vue({
  el: #example,components: {
    home,post,archive,},data:{
    index:0homepostarchive],computed:{
    currentView(){
        return this.arr[.index];
    }
  },methods:{
    change(){
      .index  (++.index)%3;
    }
  }
})
>

使用<keep-alive>缓存

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition>相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

基本用法

keep-alive>
    >  
  >

条件判断

如果有多个条件性的子元素,<keep-alive> 要求同时只有一个子元素被渲染:

home v-if="index===0"homeposts v-else-if="index===1"postsarchive v-elsearchive<div>我是主页/div>`},
    posts:{template:`我是提交页    archive:{template:`我是存档页  },methods:{
    change(){
      let len  Object.keys(.$options.components).length;
      len;
    }
  }
})
>

activated 和 deactivated

activated 和 deactivated 在 <keep-alive> 树内的所有嵌套组件中触发:

="currentView" @pass-data="getData"> 
  p>{{msg}}''div>`,1)">        activated(){
          .$emit(pass-data主页被添加);
        },deactivated(){
          主页被移除      {template:`div>`}
    ],1)"> len = .arr.length;
       len;
    },getData(value){
      .msg  value;
      setTimeout(()=>{
        ;
      },1)">500)
    }
  }
})
>

include和exclude

include 和exclude属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:

<!-- 逗号分隔字符串 -->
keep-alive include="a,b"="view" 正则表达式 (使用 v-bind) :include="/a|b/" Array (use v-bind) ="['a','b']">

匹配首先检查组件自身name选项,如果name选项不可用,则匹配它的局部注册名称(父组件 components 选项的键值)。匿名组件不能被匹配。

="home,archive">

上面的代码,表示只缓存home和archive,不缓存posts

方式二:动态注册组件实现

 asyncComponents(templateName){
    this.curNavComponents = require(`./components/${templateName}.vue`).default;
}

参考地址:

相关文章

问题现象 elmentui的el-tree数据加载问题,导致第一次加载选中当前节点和高亮当前节点没有生效。 解决方...
因为刚打开文件,vscode默认是预览状态,如果编辑过之后,就不会有这个问题。 可以通过双击将预览状态接...
前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案。没有看过的小伙伴可以看一下这篇文章。 h...
在项目中引入动态路由时报错 写法: 报错: Module build failed (from ./node_modules/_eslint-loader@2...
问题产生 在使用babel编译es6时,遇到报错Uncaught ReferenceError: regeneratorRuntime is not define...
父组件的编写 &amp;lt;a:orgCode=orgCode &amp;gt;&amp;lt;/a&amp;gt; 在data里面增加...