vant4 Tab 标签页切换数据

本文介绍了如何在Vue应用中使用Tab标签页、粘性布局、列表的滚动加载以及下拉刷新功能,包括v-model绑定、事件处理和数据请求的实现。

Tab 标签页切换数据

active表示标签的值,通过 sticky 属性可以开启粘性布局,粘性布局下,标签页滚动到顶部时会自动吸顶。

List 列表

当列表即将滚动到底部时,会触发事件(@load)并加载更多列表项。当组件滚动到底部时,会触发 load 事件并将 loading 设置成 true。此时可以发起异步操作并更新数据,数据更新完毕后,将 loading 设置成 false 即可。若数据已全部加载完毕,则直接将 finished 设置成 true 即可

PullRefresh 下拉刷新

下拉刷新时会触发 refresh 事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将 v-model 设置为 false,表示加载完成。

<van-tabs v-model:active="active" sticky @click-tab="onClickTab">
      <van-tab
        v-for="(item, index) in navList"
        :title="item.title"
        :name="item.name"
        :key="index"
      >
        <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
          <van-list
            v-model:loading="loading"
            :finished="finished"
            finished-text="没有更多了"
            @load="onLoad"
            offset="10"
          >
            <OrderShop :companyList="companyList" :list="list" @close="load" />
          </van-list>
        </van-pull-refresh>
      </van-tab>
    </van-tabs>
export default {
  data() {
    return {
      active: 0,
       navList: [
       { title: "全部", name: 0 },
        { title: "待发货", name: 2 },
        { title: "已完成", name: 127 },
        { title: "已售后", name: -126 }],
      list: [],
      token: "",
      loading: false,
      finished: false,
      pageNo: 1,
      length: 0,
      total: 0,
      companyList: [],
      refreshing: false,
   };
  },
  mounted() {
    this.init(this.active);
  },
  onClickTab({ title, name }) {
      this.list = [];
      this.pageNo = 1;
      this.loading = true;
      this.finished = false;
      this.init(name);
    },
    //上拉刷新
    onRefresh() {
      this.finished = false;
      this.loading = true;
      this.pageNo = 1;
      this.list = [];
      this.init(this.active);
    },
    //下拉加载
    onLoad() {
      console.log("onLoad加载更多~");
      setTimeout(() => {
        if (this.length >= this.total) {
          this.finished = true;
        } else {
          this.pageNo++;
          this.init(this.active);
        }
      }, 1000);
    },
    //请求数据
    init(status) {
      this.loading = true;
      let query = {
        pageNo: this.pageNo,
        pageSize: 10,
        status: status,
        supplierToken: this.token,
      };
      http
        .post("p", query)
        .then((res) => {
          if (res.code == 200) {
            this.loading = false;
            let list = [...this.list, ...res.data.list];
            this.list = list;
            this.length = list.length;
            this.total = res.data.total;
            if(this.refreshing){
              this.refreshing=false
            }
          }
        })
        .catch((err) => {
          showToast(JSON.stringify(err));
        });
    },
}
### Vue Vant Tab 切换不同组件的实现方式与示例 在 Vue 中使用 VantTab 组件实现内容切换时,可以通过动态组件的方式加载不同的子组件。以下是一个完整的实现方法和示例代码。 #### 实现步骤说明 通过 `v-model` 将当前选中的 Tab 索引绑定到一个变量上,并根据该变量动态渲染对应的内容或组件。可以结合 Vue 的 `<component>` 动态组件功能,或者通过条件渲染(如 `v-if`)来实现内容切换[^1]。 #### 示例代码 以下是基于 VantTab 组件实现动态内容切换的完整代码示例: ```vue <template> <div> <!-- 使用 VantTabsTab 组件 --> <van-tabs v-model:active="activeTab" @change="onChange"> <van-tab title="组件一">内容一</van-tab> <van-tab title="组件二">内容二</van-tab> <van-tab title="组件三">内容三</van-tab> </van-tabs> <!-- 动态渲染对应的组件 --> <component :is="currentComponent" /> </div> </template> <script> // 引入需要动态加载的组件 import ComponentOne from './ComponentOne.vue'; import ComponentTwo from './ComponentTwo.vue'; import ComponentThree from './ComponentThree.vue'; export default { data() { return { activeTab: 0, // 当前选中的 Tab 索引 componentsMap: ['ComponentOne', 'ComponentTwo', 'ComponentThree'], // 组件映射 }; }, computed: { currentComponent() { // 根据当前 Tab 索引返回对应的组件名称 return this.componentsMap[this.activeTab]; }, }, methods: { onChange(index) { console.log('当前选中的 Tab 索引:', index); }, }, components: { ComponentOne, ComponentTwo, ComponentThree, }, }; </script> <style scoped> /* 自定义样式 */ </style> ``` #### 代码解析 1. **VantTabsTab 组件**:`van-tabs` 提供了选项卡的功能,`v-model:active` 绑定了当前选中的 Tab 索引。 2. **动态组件**:通过 Vue 的 `<component>` 标签和 `:is` 属性,动态渲染对应的组件。 3. **组件映射**:通过 `componentsMap` 数组将 Tab 索引与组件名称一一对应。 4. **事件监听**:`@change` 监听 Tab 切换事件,可以在切换时执行额外逻辑。 #### 注意事项 - 确保每个子组件都已正确引入并注册到父组件中。 - 如果子组件较大或复杂,可以考虑使用异步组件以优化性能[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值