使用 element-ui 中制作Tab切换(切换vue组件踩坑)

👉 该文章承接下文 “父组件异步获取数据传给子组件获取不到”

一、问题

vue项目中运用到了Tab切换,切换vue组件,如图切换封装的echarts图表组件
❗ **==> 注意:此时用的自己写的死数据,图表也添加了监听事件使图表随窗口变化而变化 **

代码如下:

   <el-tabs v-model="attributeName">
     <el-tab-pane label="用户数量" name="first">
       <Charts :barData="bardatas.count" type="bar" />
     </el-tab-pane>
     <el-tab-pane label="用户金额" name="second">
       <Charts :barData="bardatas.money" type="bar" />
     </el-tab-pane>
     <el-tab-pane label="服务模式" name="third">
       <Charts :barData="bardatas.type" type="bar" />
     </el-tab-pane>
   </el-tabs>

初始状态默认显示第一个tab时是正确的,如图:
在这里插入图片描述
当切换到第二第三个tab时,图表显示不完整,如图:
在这里插入图片描述

二、探究

后来发现,在初始页面加载完成时这三个tab都加载完成,再次切换的时候你会发现,组件不会重新渲染了
在这里插入图片描述
之后通过display:none;和 display: block;实现Tab来回切换
在这里插入图片描述
找到原因: 第二个和第三个tab中的echarts图表之所以显示不完整是因为echarts在页面加载之前就完成了绘制,此时图表所在div没有宽度,echarts会默认一个宽度绘制成图表
现在找到问题所在了,只要在切换到该tab时再绘制改tab下的echarts图表就可以

三、解决

1、发现有个属性element-ui中的属性 lazy:标签是否延迟渲染 (该方法不可取:等窗口大小发生变化时再切换tab图表不完整)

   <el-tabs v-model="attributeName">
     <el-tab-pane label="用户数量" name="first" :lazy="true">
       <Charts :barData="bardatas.count" type="bar" />
     </el-tab-pane>
     <el-tab-pane label="用户金额" name="second" :lazy="true">
       <Charts :barData="bardatas.money" type="bar" />
     </el-tab-pane>
     <el-tab-pane label="服务模式" name="third" :lazy="true">
       <Charts :barData="bardatas.type" type="bar" />
     </el-tab-pane>
   </el-tabs>

在这里插入图片描述

结果发现:在三个tab都加载完后,窗口大小发生变化时又回到了那个图表显示不全的问题
原因:因为这个属性仅仅是控制什么时候渲染tab-pane内的组件,和路由懒加载的逻辑一样,第一次仅加载首屏,后面用到了再加载(渲染),加载完三个tab之后通过display:none;和 display: block;实现接下来的Tab来回切换功能

2、利用v-if实现:我们想要的是每次切换tab都能够让对应的tab子组件进行重新渲染。

  <el-tabs v-model="attributeName">
    <el-tab-pane label="用户数量" name="first">
      <Charts v-if="attributeName === 'first'" :barData="bardatas.count" type="bar" />
    </el-tab-pane>
    <el-tab-pane label="用户金额" name="second">
      <Charts v-if="attributeName === 'second'" :barData="bardatas.money" type="bar" />
    </el-tab-pane>
    <el-tab-pane label="服务模式" name="third">
      <Charts v-if="attributeName === 'third'" :barData="bardatas.type" type="bar" />
    </el-tab-pane>
  </el-tabs>

小插曲

  // 监听窗口变化 - 只刷新最后一个图表
  window.onresize = myChart.resize;
  // 监听窗口变化 - 多个图表同时刷新
  window.addEventListener("resize", () => {
    myChart.resize();
  });

=== >如有错误欢迎指出😁

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,使用 element-ui Tabs 组件可以很方便地实现 Tab 点击切换内容的效果,并且也可以自定义样式。 首先,在需要使用 Tabs 组件的页面引入 Tabs 组件: ```vue <template> <el-tabs v-model="activeTab"> <el-tab-pane label="Tab 1">Content of Tab Pane 1</el-tab-pane> <el-tab-pane label="Tab 2">Content of Tab Pane 2</el-tab-pane> <el-tab-pane label="Tab 3">Content of Tab Pane 3</el-tab-pane> </el-tabs> </template> <script> import { Tabs, TabPane } from 'element-ui'; export default { components: { 'el-tabs': Tabs, 'el-tab-pane': TabPane }, data() { return { activeTab: 'Tab 1' } } } </script> ``` 在上面的示例,我们使用了 `el-tabs` 和 `el-tab-pane` 组件来创建 Tabs,并且使用 `v-model` 指令来绑定当前选TabTabs 的每个 Tab 都由 `el-tab-pane` 组件来表示,它们的 `label` 属性用来设置 Tab 的显示名称,而标签对之间的内容则是 Tab 的内容。 可以在 `el-tabs` 组件上添加 `type` 属性来设置 Tab 的类型,比如 `card` 表示卡片式的 Tab,`border-card` 表示带边框的卡片式 Tab 等等。 ```vue <template> <el-tabs v-model="activeTab" type="card"> <el-tab-pane label="Tab 1">Content of Tab Pane 1</el-tab-pane> <el-tab-pane label="Tab 2">Content of Tab Pane 2</el-tab-pane> <el-tab-pane label="Tab 3">Content of Tab Pane 3</el-tab-pane> </el-tabs> </template> <script> import { Tabs, TabPane } from 'element-ui'; export default { components: { 'el-tabs': Tabs, 'el-tab-pane': TabPane }, data() { return { activeTab: 'Tab 1' } } } </script> ``` 除此之外,我们也可以自定义 Tab 的样式,比如设置 Tab 的背景色、文字颜色、边框等等: ```vue <template> <el-tabs v-model="activeTab" class="custom-tab"> <el-tab-pane label="Tab 1">Content of Tab Pane 1</el-tab-pane> <el-tab-pane label="Tab 2">Content of Tab Pane 2</el-tab-pane> <el-tab-pane label="Tab 3">Content of Tab Pane 3</el-tab-pane> </el-tabs> </template> <script> import { Tabs, TabPane } from 'element-ui'; export default { components: { 'el-tabs': Tabs, 'el-tab-pane': TabPane }, data() { return { activeTab: 'Tab 1' } } } </script> <style scoped> .custom-tab .el-tabs__header { background-color: #f2f2f2; border-radius: 4px; } .custom-tab .el-tabs__item.is-active { color: #fff; background-color: #409EFF; border-color: #409EFF; } .custom-tab .el-tabs__item { color: #606266; border-color: #dcdfe6; } </style> ``` 在上面的示例,我们为 `el-tabs` 组件添加了一个名为 `custom-tab` 的 class,然后在样式表设置了该 class 下的 Tab 的样式。这样就可以实现自定义样式的效果了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值