van-tabs的底部条位置错误,resize方法没有作用

最近在使用vant里面的组件,van-tabs是,底部条位置总是错误,页面长这样

可是我想要的结果是这样

官网所说的解决办法如图,不过我由于某些限制不能使用第一种方法,第二种方法resize使用了没有作用

后面我发现了三种解决办法(如果说明不清楚,可看代码),办法如下

方法1:在nextTick里面给要展示tab数组赋值

方法2:在nextTick里面改变active的值,这里需要注意,赋的值和原始值必须不一样

方法3:把要赋值的函数换为 async 函数,结果换为 await 获取

代码如下:

<template>
  <van-tabs
    v-model:active="active"
    class="channels-tabs"
    swipe-threshold="1"
    ref="tabs"
  >
    <van-tab
      v-for="tab in tabArr"
      :key="tab"
      :title="tab"
    >{{tab}}</van-tab>
  </van-tabs>
</template>

<script>
import { nextTick, onMounted, reactive, ref, toRefs, getCurrentInstance } from 'vue';
function useTabs (active) {
  const tabObj = reactive({
    tabArr: []
  })
  const onAxios = () => { // 模拟请求数据
    const res = ['关注', '推荐', '体育', '热点', '财经']
    // tabObj.tabArr = res  // 这里直接这样会导致底部条位置不准
    // 方法1,使用 方法1 时需要把上面的 tabObj.tabArr = res  注释
    nextTick(() => {
      tabObj.tabArr = res
    })
    // 方法2
    // nextTick(() => {
    //   active.value = 1   // 这里的赋值要和初始值不一样,不然不生效
    // })
  }

  //   方法3,把请求换为 async 函数,结果加上 await
  //   const onAxios = async () => { // 模拟请求数据
  //     const res = ['关注', '推荐', '体育', '热点', '财经']
  //     tabObj.tabArr = await res
  // }

  onMounted(() => {
    onAxios()
    // 下年是官网看的 resize() 方法,但是我试了,没有作用
    // const currentInstance = getCurrentInstance()  // 获取当前实例
    // currentInstance.refs.tabs.resize()     // 类似于 vue2 的 this.$refs.tabs.resize()
  })
  return {
    tabObj
  }
}
export default {
  setup () {
    const active = ref(0);
    const { tabObj } = useTabs(active)
    return {
      active,
      ...toRefs(tabObj),
    };
  },
};
</script>

<style>
.channels-tabs .van-tab {
  min-width: 120px;
  border-right: 1px solid #edeff3;
  font-size: 16px;
  color: #777;
}
.channels-tabs .van-tab--active {
  color: red;
}
.channels-tabs .van-tabs__line {
  background-color: #3296fa;
  width: 20px;
  height: 6px;
}
.channels-tabs .hamburger-btn {
  /* 固定定位 */
  position: fixed;
  right: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 66px;
  height: 32px;
  background-color: #fff;
  /* 设置透明度 */
  opacity: 0.902;
  /* 设置图标的大小 */
  font-size: 23px;
}
.channels-tabs .van-tabs__wrap {
  width: 100%;
  position: fixed;
  left: 0;
  top: 46px;
  z-index: 1;
}
</style>

VanWeApp 的 `van-tabs` 组件是一个用于显示一组选项卡的UI组件,它可以帮助你轻松地切换内容区域。如果你想在内部的 `van-tabs` 中继续嵌套另一个 `van-tabs`,这通常称为嵌套 tab 组件,你可以按照以下步骤操作: 1. 首先,在外部的 `van-tabs` 组件里,设置一个 `<van-tab>` 元素,给每个 tab 设置一个标签,并为其分配一个对应的视图区域。 ```html <van-tabs> <van-tab v-for="(item, index) in externalTabs" :key="index"> <template slot="title">{{ item.title }}</template> <div class="tab-content"> <!-- 这里是外部的第一个tabs的内容 --> <van-tabs ref="nestedTabs" :options="nestedTabOptions" @change="handleNestedChange"></van-tabs> </div> </van-tab> </van-tabs> ``` 2. 然后,在外部 tabs 内部的某个地方,动态创建并管理内部嵌套的 `van-tabs` 组件,通过 `ref` 获取到该组件实例,并传入必要的选项数据。 3. 定义内部 `van-tabs` 的选项 (`nestedTabOptions`) 和事件处理函数 (`handleNestedChange`)。 ```javascript data() { return { nestedTabOptions: [ { title: 'Tab 1', value: 'tab1' }, { title: 'Tab 2', value: 'tab2' }, ], }; }, methods: { handleNestedChange(tabKey) { // 根据需要更新外部tabs的内容或其他状态 this.externalState = tabKey; } } ``` 4. 当内部的 `van-tabs` 发生改变时,可以监听 `@change` 事件并相应地更新外部状态或触发其他操作。 注意,虽然这种嵌套是可以的,但过多层级的嵌套可能会导致界面复杂度增加,影响用户体验。合理规划组件结构和逻辑是很重要的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值