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;
}

参考地址:

相关文章

https://segmentfault.com/a/1190000022018995 https://www....
ES6 (ECMAScript 6)中的模块是一个包含 JavaScript 代码的...
from https://mp.weixin.qq.com/s/-rc1lYYlsfx-wR4mQmIIQQ V...
D:\Temp&gt;npm init vite@latest vue3study --temp...
文章浏览阅读1.2k次。最近自己从零撸起的甘特图组件需要子组...
文章浏览阅读3.3k次,点赞3次,收藏16次。静默打印是什么?简...