[ElementPlus] 多标签页切换

版本
  • "element-plus": "2.1.9"
Store
export interface Tab {
  title: string
  content: string
}
const store = createStore<{
  tabs: Tab[]
  current: Tab | null
}>({
  state: {
    tabs: [],
    current: null
  },
  mutations: {
    changeCurrent: (state, { index }) => {
      state.current = state.tabs[index] || null
    },
    addTab: state => {
      state.tabs.push({
        title: `标签 - ${state.tabs.length + 1}`,
        content: `内容 - ${state.tabs.length + 1}`
      })
      state.current = state.tabs[0]
    },
    removeTab: (state, { index }) => {
      state.tabs.splice(index, 1)
    }
  }
})
页面
<template>
  <el-input-number v-model="inputValue" />

  <div>
    {{ store.state.current?.title || '' }}
  </div>

  <el-button @click="() => addTab()">增加</el-button>

  <el-tabs
    v-model="state.name"
    :closable="true"
    type="border-card"
    @tab-remove="tabPanelName => removeTab(tabPanelName.toString())"
  >
    <template v-for="(tab, index) in store.state.tabs" :key="index">
      <el-tab-pane :label="tab.title" :name="`${index}`">
        {{ tab.content }}
      </el-tab-pane>
    </template>
  </el-tabs>
</template>

<script setup lang="ts">
import { computed, reactive, watch } from 'vue'
import { useStore } from 'vuex'
import { type Tab } from './store'

const store = useStore<{
  tabs: Tab[]
  current: Tab | null
}>()

const state = reactive<{
  name: string
}>({
  name: '0'
})

const addTab = () => {
  store.commit('addTab')
}

const removeTab = (name: string) => {
  const index = Number.parseInt(name)
  store.commit('removeTab', { index })
  const currentIndex = Number.parseInt(state.name)
  if (index <= currentIndex) {
    state.name = `${currentIndex - 1}`
  }
}

watch(state, (newValue, oldValue) => {
  store.commit('changeCurrent', { index: Number.parseInt(newValue.name) })
})

const inputValue = computed({
  get: () => Number.parseInt(state.name),
  set: value => (state.name = `${value}`)
})
</script>
坑点

el-tabs 组件的事件回调参数 tabPanelNameel-tab-pane 组件的参数 name 类型并不一致,需要额外进行转换。

如果直接使用数字类型的下标作为 name,当切换到倒数第二个标签页并进行关闭时,v-model 绑定的值会因为 0"0" 类型不同,从而导致第一个 Tab 页无法自动显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
elementui标签切换过渡动画可以使用Vue的transition组件来实现。具体步骤如下: 1. 在el-tabs标签中添加name属性,用于指定transition组件的name值。 2. 在el-tabs标签中添加v-model属性,用于绑定当前选中的标签。 3. 在el-tabs标签中添加@tab-click事件,用于在标签切换时触发动画效果。 4. 在el-tabs-pane标签中添加name属性,用于指定当前标签的name值。 5. 在el-tabs-pane标签中添加v-if属性,用于控制当前标签的显示与隐藏。 6. 在el-tabs-pane标签中添加transition组件,用于实现过渡动画效果。 以下是一个示例代码: ```html <template> <el-tabs v-model="activeName" name="tab-demo" @tab-click="handleTabClick"> <el-tab-pane label="标签1" name="tab1"> <transition name="tab-fade"> <div v-if="activeName === 'tab1'"> <!-- 标签1的内容 --> </div> </transition> </el-tab-pane> <el-tab-pane label="标签2" name="tab2"> <transition name="tab-fade"> <div v-if="activeName === 'tab2'"> <!-- 标签2的内容 --> </div> </transition> </el-tab-pane> </el-tabs> </template> <script> export default { data() { return { activeName: 'tab1' } }, methods: { handleTabClick(tab) { // 标签切换时触发 } } } </script> <style> .tab-fade-enter-active, .tab-fade-leave-active { transition: opacity 0.5s; } .tab-fade-enter, .tab-fade-leave-to { opacity: 0; } </style> ``` 在上面的代码中,我们使用了Vue的transition组件来实现标签切换的过渡动画效果。其中,我们通过给el-tabs标签添加name属性来指定transition组件的name值,通过给el-tabs-pane标签添加name属性来指定当前标签的name值,通过给el-tabs-pane标签添加v-if属性来控制当前标签的显示与隐藏。同时,我们还通过在style标签中添加CSS样式来定义了过渡动画的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值