vue中用饿了么tabs组件切换component标签组件 component组件嵌套,导致页面重复渲染

因详情页面,有多个tab选项卡考虑页面多处重复使用,而且有多个页面组成,最终决定使用 组件方式来引用页面。

因 项目采用的UI组件是 element-ui,刚好看到有一个 样式很类似于 tab选项卡,就采用了 element的 tabs组件,可是 没想到问题就是出现 这儿。
在这里插入图片描述

错误代码:

<el-tabs class="header-tabs" v-model="activeName" @tab-click="handleClick">
   <el-tab-pane
     v-for="item of tabs"
     :key="item.id"
     :label="item.label"
     :name="item.id"
     :component="item.component"
     lazy
     >
      <keep-alive exclude="ContentManage">
          <component :is="currentComponent" :customeroid="agencyid"></component>
      </keep-alive>
     </el-tab-pane>
</el-tabs>

因为上述采用了 tabs选项卡,而且也使用 v-for循环(没办法,主要是 tabs是动态的),导致 每个页面不仅没有办法 缓存,反而 一直重复发送请求。自己百度了好久,最后没办法寻求帮助,在大佬们 远程帮助下 最终发现的是 tabs下的 v-for导致。

因为 component 写在v-for循环中,每次循环都会 创建一个 对象,导致创建很多的组件,点击一次tabs 循环后的 所有的 component都 发送了请求,每次点击一次后,都会减少一次请求(因为 keep-alive缓存的问题)。

最终解决的方法,不在 element-ui的 tabs组件,自己手写页面,反正样式不复杂。

正确代码

<ul class="tabs-ul">
    <li
        v-for="(item) in currentTabs"
        :key="item.id"
        :class="{ active: tabSelect === item.id }"
        @click.prevent="changetabs(item.id)"
        >
        {{ item.label }}
    </li>
</ul>
<keep-alive exclude="ContentManage">
    <component :is="currentComponent" :customeroid="agencyid"></component>
</keep-alive>

这样的就可以避免创建多个组件,从而不在出现 重复发送请求的bug。
————————————————
版权声明:本文为CSDN博主「foxhuli229」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaohuli_hyr/article/details/106325947

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue的el-tabs组件默认情况下页面加载时同时加载所有的标签页内容,如果标签页内容比较多或者比较复杂,导致页面加载速度变慢,影响用户体验。因此,我们可以使用Vue的异步组件和懒加载技术来实现el-tabs的延迟加载。 具体实现方法如下: 1. 在el-tabs组件中,将标签页内容的slot改为异步组件的形式,即使用Vue的`<component :is="componentName">`语法来动态加载组件。 2. 在异步组件中,使用Vue的`Vue.lazy()`方法来实现懒加载,即只有在需要显示该标签页内容时才加载该组件。 下面是一个示例代码: ``` <template> <el-tabs v-model="activeName" @tab-click="handleClick"> <el-tab-pane label="Tab 1" name="1"> <component :is="tab1Component"></component> </el-tab-pane> <el-tab-pane label="Tab 2" name="2"> <component :is="tab2Component"></component> </el-tab-pane> <el-tab-pane label="Tab 3" name="3"> <component :is="tab3Component"></component> </el-tab-pane> </el-tabs> </template> <script> export default { data() { return { activeName: '1', tab1Component: null, tab2Component: null, tab3Component: null } }, methods: { handleClick(tab, event) { // 点击标签页时动态加载组件 if (tab.name === '1') { import('./Tab1.vue').then((module) => { this.tab1Component = module.default }) } else if (tab.name === '2') { import('./Tab2.vue').then((module) => { this.tab2Component = module.default }) } else if (tab.name === '3') { import('./Tab3.vue').then((module) => { this.tab3Component = module.default }) } } } } </script> ``` 在上面的代码中,我们使用了`import()`方法来动态加载组件,当用户点击标签页时,才异步加载对应的组件。这样就可以实现el-tabs的延迟加载了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值