Vue3 Element Plus el-tabs数据刷新方法

方法1: 使用 @tab-change 事件

javascript 复制代码
<template>
  <el-tabs v-model="activeTab" @tab-change="handleTabChange">
    <el-tab-pane label="Tab 1" name="tab1">
      <div v-if="activeTab === 'tab1'">
        <!-- 内容1 -->
        {{ tab1Data }}
      </div>
    </el-tab-pane>
    <el-tab-pane label="Tab 2" name="tab2">
      <div v-if="activeTab === 'tab2'">
        <!-- 内容2 -->
        {{ tab2Data }}
      </div>
    </el-tab-pane>
  </el-tabs>
</template>

<script setup>
import { ref } from 'vue';

const activeTab = ref('tab1');
const tab1Data = ref(null);
const tab2Data = ref(null);

const handleTabChange = (tabName) => {
  if (tabName === 'tab1') {
    fetchTab1Data();
  } else if (tabName === 'tab2') {
    fetchTab2Data();
  }
};

const fetchTab1Data = async () => {
  // 模拟API请求
  tab1Data.value = await new Promise(resolve => {
    setTimeout(() => resolve('Tab 1 数据已刷新'), 500);
  });
};

const fetchTab2Data = async () => {
  // 模拟API请求
  tab2Data.value = await new Promise(resolve => {
    setTimeout(() => resolve('Tab 2 数据已刷新'), 500);
  });
};

// 初始化加载第一个tab的数据
fetchTab1Data();
</script>

方法2: 使用 v-if 控制内容渲染

javascript 复制代码
<template>
  <el-tabs v-model="activeTab">
    <el-tab-pane label="Tab 1" name="tab1">
      <Tab1Content v-if="activeTab === 'tab1'" />
    </el-tab-pane>
    <el-tab-pane label="Tab 2" name="tab2">
      <Tab2Content v-if="activeTab === 'tab2'" />
    </el-tab-pane>
  </el-tabs>
</template>

<script setup>
import { ref } from 'vue';
import Tab1Content from './Tab1Content.vue';
import Tab2Content from './Tab2Content.vue';

const activeTab = ref('tab1');
</script>

在子组件中使用 onMounted 钩子加载数据:

javascript 复制代码
<!-- Tab1Content.vue -->
<script setup>
import { onMounted, ref } from 'vue';

const data = ref(null);

onMounted(async () => {
  // 加载数据
  data.value = await fetchData();
});
</script>

方法3: 使用 keep-aliveactivated 钩子

如果需要缓存组件但依然在切换时刷新数据:

html 复制代码
<template>
  <el-tabs v-model="activeTab">
    <el-tab-pane label="Tab 1" name="tab1">
      <keep-alive>
        <Tab1Content v-if="activeTab === 'tab1'" />
      </keep-alive>
    </el-tab-pane>
    <el-tab-pane label="Tab 2" name="tab2">
      <keep-alive>
        <Tab2Content v-if="activeTab === 'tab2'" />
      </keep-alive>
    </el-tab-pane>
  </el-tabs>
</template>

在子组件中使用 activated 钩子:

javascript 复制代码
<!-- Tab1Content.vue -->
<script setup>
import { ref, activated } from 'vue';

const data = ref(null);

const loadData = async () => {
  data.value = await fetchData();
};

// 组件激活时加载数据
activated(() => {
  loadData();
});

// 初始加载
loadData();
</script>

注意事项

  1. 使用 v-if 会完全销毁和重建组件,适合数据完全独立的情况

  2. keep-alive + activated 适合需要保留组件状态但刷新数据的情况

  3. 对于简单场景,直接使用 @tab-change 事件即可

相关推荐
顾安r7 小时前
11.8 脚本网页 星际逃生
c语言·前端·javascript·flask
im_AMBER7 小时前
React 17
前端·javascript·笔记·学习·react.js·前端框架
一雨方知深秋8 小时前
2.fs模块对计算机硬盘进行读写操作(Promise进行封装)
javascript·node.js·promise·v8·cpython
顺凡10 小时前
删一个却少俩:Antd Tag 多节点同时消失的原因
前端·javascript·面试
前端大卫10 小时前
动态监听DOM元素高度变化
前端·javascript
Cxiaomu10 小时前
React Native App 图表绘制完整实现指南
javascript·react native·react.js
qq. 280403398411 小时前
vue介绍
前端·javascript·vue.js
Mr.Jessy11 小时前
Web APIs 学习第五天:日期对象与DOM节点
开发语言·前端·javascript·学习·html
速易达网络12 小时前
HTML<output>标签
javascript·css·css3
!win !12 小时前
前端跨标签页通信方案(上)
前端·javascript