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 事件即可

相关推荐
LuckyLay5 小时前
Vue百日学习计划Day33-35天详细计划-Gemini版
前端·vue.js·学习
ᖰ・◡・ᖳ5 小时前
JavaScript:PC端特效--缓动动画
开发语言·前端·javascript·css·学习·html5
苹果酱05677 小时前
Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
java·vue.js·spring boot·mysql·课程设计
会飞的鱼先生7 小时前
vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
前端·vue.js·git·json
布Coder8 小时前
前端 vue + element-ui 框架从 0 - 1 搭建
前端·javascript·vue.js
i_am_a_div_日积月累_8 小时前
Element Plus 取消el-form-item点击触发组件,改为原生表单控件
前端·vue.js·elementui
小刘不知道叫啥10 小时前
简单说一下 Webpack分包
前端·javascript·webpack·node.js
MessiGo10 小时前
Javascript 编程基础(2)基础知识 | 2.1、javascript与Node.js
开发语言·javascript·node.js
肥肠可耐的西西公主10 小时前
前端(vue)学习笔记(CLASS 6):路由进阶
前端·vue.js·学习
李梨与狸11 小时前
vue中excel文件 打包后不展示问题
前端·vue.js·excel