vant的tabs加上swipeable或animated属性会出错

vant的tabs加上swipeable或animated属性会出错

        <van-tabs v-model:active="active" sticky animated>
          <van-tab
            v-for="(item, index) in tabs"
            :title="item.title"
            :key="index"
          >
            <TabContent :indexName="index" />
          </van-tab>
        </van-tabs>

第一个tab会给TabContent 组件传入两个indexName 0和1,然后点击第二个tab之后传入的index变成了2 。
而不添加swipeable或animated就不会有这个问题,请问怎么解决呢?
vant的版本是 3.2.47

来自gpt的回答:
如果在van-tabs中没有开启swipeable或animated,那么切换标签页时并不会同时渲染所有标签页的内容,而是只会渲染当前激活的标签页的内容。因此,在这种情况下,每个TabContent组件对应的索引值就是唯一的。

如果在van-tabs中开启了swipeable或animated,那么所有标签页的内容都会被提前渲染出来,并进行缓存,这就导致了当你切换标签页时,由于所有内容都已经渲染出来了,所以不同的TabContent组件实例对应的索引值也可能是相同的,会出现问题。

为了解决这个问题,你可以考虑将TabContent组件中的indexName属性改为一个计算属性,根据当前激活的标签页动态计算得到,例如:

<template>
  <div>{{ index }}</div>
</template>

<script>
export default {
  props: {
    tabKey: String,
    tabs: Array
  },
  computed: {
    index() {
      return this.tabs.findIndex((item) => item.key === this.tabKey)
    }
  }
}
</script>



然后在父组件中将TabContent组件中的indexName属性改为tab.key,例如:


<van-tab
  v-for="(tab, index) in tabs"
  :title="tab.title"
  :key="index"
>
  <TabContent :tabKey="tab.key" :tabs="tabs" />
</van-tab>

这样,无论是否开启了swipeable或animated,都可以通过tab.key来动态计算得到每个TabContent组件实例对应的索引值,避免出现问题。