vue keep-alive搭配component做带移除选项卡功能的管理页面,如何动态清除指定的组件缓存?

使用keep-alive搭配component:is,以及左侧菜单和选项卡组件,组成一个管理页面,现在要给选项卡加移除按钮。

移除选项卡时,要把keep-alive缓存的对应组件给清掉。

每个被添加的组件,要么基于路径动态导入的组件(()=>import()),要么是通过import from的形式导入的(这种会使用多个实例)。

流程基本是:先调用Vue.component(page_id,mycomponent)注册导入的组件,将page_id变量的内容作为注册的组件名字,然后把page_id赋值给component的is绑定的属性。再把page_id赋值给选项卡组件的v-model绑定的属性

要根据page_id清除指定组件的缓存,清除组件缓存之后,还得根据page_id清除对应的选项卡,以及其他的操作

问题:根据page_id清除指定注册的组件的缓存,请问怎么做?比如需要调用vue自带什么方法?

代码:
html代码:

 <div class="tabs">
        <div class="tabHeader">
         <div>
          <el-tabs v-model="activeName" @tab-click="tabHeaderClick" @tab-remove="removeTab" >
            <el-tab-pane  v-for="(item) in tab_list" :label="item.label" :name="item.page_id" closable  >
              
            </el-tab-pane>
          </el-tabs>
         </div>
        </div>
        <div class="tabContent">
          <keep-alive>
            <component :is="viewName" :key="viewName" :message="page_message" ></component>
          </keep-alive>
        </div>
      </div>

相关vue代码

data() {
    return {
    //动态组件所在文件夹路径
      pagePathBase:"../testComponent",
      //选项卡绑定属性
      activeName: undefined,
      //component标签绑定内容
      viewName:undefined,
      选项卡列表
      tab_list:[

      ],
      //子组件参数
      page_message:undefined,
      
       菜单列表
      menuItems:[
        {menu_type:1,label:"菜单1",page_id:"a1",view_type:1,view_path:"/test1.vue"},
        {menu_type:2,label:"菜单2",page_id:"a2",children:[
          {menu_type:1,label:"子菜单1",page_id:"a3",view_type:2},
          {menu_type:1,label:"子菜单2",page_id:"a4",view_type:1,view_path:"/test2.vue"},
        ]},
        {menu_type:1,label:"菜单3",page_id:"a5",view_type:2},
      ],
      
    };
  },
  methods: {
   

    removeTab(val){
      var index = this.tab_list.findIndex((item) => item.page_id === val);
      if(index==-1){
        return;
      }
      this.tab_list.splice(index, 1);
      if(val== this.activeName){
        this.activeName=undefined;
        this.viewName=undefined;
      }
    },

    tabHeaderClick(val){
      this.viewName=val.name;
    },
    //菜单点击
    MenuClick(item){
      var tabItem = this.tab_list.find((tabItem) => tabItem.page_id === item.page_id);
      if(tabItem!=undefined){
        this.activeName=tabItem.page_id;
        this.viewName=tabItem.page_id;
        return;
      }
      if(item.view_type==1){
    //动态导入的组件
          var loadComponent = () =>  import(this.pagePathBase+item.view_path); 
        Vue.component(item.page_id, loadComponent);
      }else if(item.view_type==2){
    //静态导入的组件
          Vue.component(item.page_id, Test3);
          this.page_message = item.page_id);;
      }

      var obj={page_id:item.page_id);,label:item.label};
      this.tab_list.push(obj);
      this.activeName=obj.page_id;
      this.viewName=obj.page_id;
    },

  },
阅读 1.9k
2 个回答

Vue.component(item.page_id, loadComponent);

注册组件的时候,已经用item.page_id做为名称了。这里直接用keep-alive组件的include属性就行了。组件data里添加一个page_id_list存放显示的page_id数组即可

 <keep-alive :include="page_id_list">
...
</keep-alive>

Vue并有似乎并提供任何关于清除keep-alive缓存的办法,
你是碰到什么问题了,为什么必须要清除缓存,不清除这些会造成什么样的后果,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题