【Vant2】Tab标签页组件自动跳转

1,127 阅读1分钟

使用Vant2写的一个商城,在首页有商品分类目录,比如说数码、家具、美妆等大分类,如下:

image.png

点击某个类比就会跳转到另一个页面,另一个页面中使用Tab显示分类,同时页面中显示对应分类下的商品目录,如下:

image.png

需求是:在首页点击 “电脑办公” 分类,跳转后Tab标签应该也自动定位到 “电脑办公”页签下,并且显示对应分类的商品列表。

问题是:跳转页面后Tab页签无法正确跳转到对应的页签下,但是显示的商品列表是正确的。

根据Vant2的Tab组件文档,我使用的是通过名称name来匹配激活的标签,name绑定的是分类目录的catId。

image.png

当在首页点击某个分类时,就会通过query传到这个页面,然后在页面的created生命周期获取全部分类目录,获取到后将 activeName 设为 在首页点击的分类的catId,目前为之,思路是没什么问题的,但是实践后发现并未达到预期的目的,tab的页签一直都是默认的第一个页签。

created() {
    // 获取全部分类目录
    getTopCategory().then((res) => {
      this.tabList = res.data; // tab页签列表
      this.catId = this.$route.query.catId;
      this.activeTab = this.$route.query.catId; // 匹配页签
      this.onTabClick(this.catId); // 获取对应分类下的商品列表
    });
},

然后观察了后台返回的tabList里面的catId,发现是number类型的,路由传递过来的是string类型的,难道vant是通过全等来匹配标签的吗?

image.png

文档中没有说,于是来到Vant的tab源码中查找,在 node_modules/vant/lib/tab/index.js 中可以看到下面这句代码

computed: {
    computedName: function computedName() {
      var _this$name;

      return (_this$name = this.name) != null ? _this$name : this.index;
    },
    isActive: function isActive() {
      var active = this.computedName === this.parent.currentName;

      if (active) {
        this.inited = true;
      }

      return active;
    }
  },

可以知道,它确实是使用全等的,因此,使用 Number() 将路由传递过来的参数转换成number类型,发现,还是不行。

然后又想,会不会是因为生命周期的原因呢?是不是应该等元素挂载完成后再去更改activeTab的值呢?于是就把activeTab的更改放到了mounted生命周期里,成功。

  created() {
    // 获取全部分类目录
    getTopCategory().then((res) => {
      this.tabList = res.data; // tab页签列表
      this.catId = this.$route.query.catId;
      this.onTabClick(this.catId);
    });
  },
  mounted() {
    this.activeTab = Number(this.$route.query.catId);
  }