切换tab时,van-list中的onload事件没触发

一个tab栏,三个tab , 需求 : 切换tab时对应的列表数据变化 (发请求时携带参数不同)

 发现切换tab时没有触发onload上拉加载事件,没有请求下一页数据 。  解决 : 切换tab时,需把之前的list置空, 再重新设置loading 和finished

// 切换tab栏
clickTab() {
      console.log(this.active);
      this.list = [];
      this.pageNo = 0;
      this.loading = true;
      this.finished = false;
      this.onLoad();
  },

完整代码   

<van-tabs v-model="active" @change="clickTab">
    <van-tab title="全部">
        <van-list
           v-model="loading"
           :finished="finished"
            finished-text="没有更多了"
            @load="onLoad"
         >
            <van-cell
              v-for="(item, index) in list"
              :key="index"
              is-link
            >
              <template #title> {{ item.customerName }} </template>
            </van-cell>
        </van-list>
     </van-tab>
     <van-tab title="未拜访">
        <van-list
            v-model="loading"
            :finished="finished"
            finished-text="没有更多了"
            @load="onLoad"
         >
            <van-cell
              v-for="(item, index) in list"
              :key="index"
              is-link
            >
              <template #title> {{ item.customerName }} </template>
            </van-cell>
         </van-list>
      </van-tab>
      <van-tab title="已拜访">
         <van-list
            v-model="loading"
            :finished="finished"
            finished-text="没有更多了"
            @load="onLoad"
         >
            <van-cell
              v-for="(item, index) in list"
              :key="index"
              is-link
             >
              <template #title> {{ item.customerName }} </template>
            </van-cell>
         </van-list>
      </van-tab>
</van-tabs>



  mounted(){
  this.loadClientList();
  }

  data() {
    return {
      //数据列表
      list: [],
      // 加载状态
      loading: true,
      // 是否加载结束
      finished: false,
      // 页码值
      pageNo: 1,
      pageSize: 10,
      // 数据总条数
      total: "",
      active: 0,
    };
  },



methods:{

   // 获取拜访客户列表
    async loadClientList() {
      if (this.active == 0) {
        try {
          const { data: res } = await getClientList({
            pageNo: this.pageNo,
            pageSize: this.pageSize
            
          });
          console.log(res);
          let rows = res.data.list;
          // 如果返回的数组是空或数组长度是0
          if (rows == null || rows.length === 0) {
            this.loading = false; // 关闭加载状态
            this.finished = true; // 加载结束
            return;
          }
          this.loading = false; // 关闭加载状态
          this.total = res.data.count;
          this.list = this.list.concat(rows);
          console.log(this.list);
          // 如果合并之后的数组长度大于返回的数据总条数
          if (this.list.length >= this.total) {
            this.finished = true; // 加载结束
          }
        } catch (err) {
          console.log("请求报错 :", err);
        }
      } else if (this.active == 1) {
        try {
          const { data: res } = await getClientList({
            pageNo: this.pageNo,
            pageSize: this.pageSize,
           
            visitStatus: "01",
          });
          console.log(res);
          let rows = res.data.list;
          // 如果返回的数组是空或数组长度是0
          if (rows == null || rows.length === 0) {
            this.loading = false; // 关闭加载状态
            this.finished = true; // 加载结束
            return;
          }
          this.loading = false; // 关闭加载状态
          this.total = res.data.count;
          this.list = this.list.concat(rows);
          console.log(this.list);
          // 如果合并之后的数组长度大于返回的数据总条数
          if (this.list.length >= this.total) {
            this.finished = true; // 加载结束
          }
        } catch (err) {
          console.log("请求报错 :", err);
        }
      } else if (this.active == 2) {
        try {
          const { data: res } = await getClientList({
            pageNo: this.pageNo,
            pageSize: this.pageSize,
           
            visitStatus: "09",
          });
          console.log(res);
          let rows = res.data.list;
          // 如果返回的数组是空或数组长度是0
          if (rows == null || rows.length === 0) {
            this.loading = false; // 关闭加载状态
            this.finished = true; // 加载结束
            return;
          }
          this.loading = false; // 关闭加载状态
          this.total = res.data.count;
          this.list = this.list.concat(rows);
          console.log(this.list);
          // 如果合并之后的数组长度大于返回的数据总条数
          if (this.list.length >= this.total) {
            this.finished = true; // 加载结束
          }
        } catch (err) {
          console.log("请求报错 :", err);
        }
      }
    },
    // 上拉加载
    onLoad() {
      this.pageNo += 1;
      this.loadClientList();
    },

    // 切换tab时
    clickTab() {
      console.log(this.active);
      this.list = [];
      this.pageNo = 0;
      this.loading = true;
      this.finished = false;
      this.onLoad();
    }
}

页面加搜索框 ,根据搜索词更新list



        <van-tab title="员工统计">
          <van-search
            v-model="search_value"
            show-action
            placeholder="请输入员工姓名"
            @search="onSearch"
          >
            <template #action>
              <div @click="onSearch">搜索</div>
            </template>
          </van-search>

           // 下面是van-list的代码

        </van-tab>

data(){

search_value: "",

}



   // 搜索
    onSearch() {
      this.list = [];
      this.pageNo = 0;
      this.loading = true;
      this.finished = false;
      this.onLoad();
    },

请求数据的代码加上搜索词传参

const { data: res } = await getClientList({
            pageNo: this.pageNo,
            pageSize: this.pageSize,
            value: this.search_value
});

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue的tab切换通常使用的是Vue Router来实现页面之间的切换。在使用Vue Router,每个页面组件会在切换会进行加载和卸载。因此,如果我们要在切换页面触发一些操作,比如执行onload函数,我们可以使用Vue Router提供的生命周期钩子函数。 对于使用Vant List组件的页面来说,在切换tab不执行onload函数,可能是因为有正确使用Vue Router的生命周期钩子函数。 要解决这个问题,我们可以在Vue Router使用beforeRouteEnter钩子函数,它会在进入页面之前执行,包括在切换tab。我们可以在该钩子函数执行我们需要的操作。 具体步骤如下: 1. 导入Vue和Vue Router ```javascript import Vue from "vue"; import VueRouter from "vue-router"; ``` 2. 使用Vue Router ```javascript Vue.use(VueRouter); const router = new VueRouter({ routes: [ // 在这里定义你的路由 ] }); ``` 3. 定义页面组件 ```javascript const Page1 = { template: ` <div> <h1>页面1</h1> </div> `, beforeRouteEnter(to, from, next) { // 在这里执行你的onload函数 next(); }, // 其他组件选项 }; const Page2 = { template: ` <div> <h1>页面2</h1> </div> `, beforeRouteEnter(to, from, next) { // 在这里执行你的onload函数 next(); }, // 其他组件选项 }; // 其他页面组件定义 ``` 4. 定义路由 ```javascript const routes = [ { path: "/page1", component: Page1 }, { path: "/page2", component: Page2 }, // 其他路由定义 ]; const router = new VueRouter({ routes }); ``` 5. 在Vue实例使用路由 ```javascript const app = new Vue({ router }); app.$mount("#app"); ``` 这样,在切换tab,页面组件会执行beforeRouteEnter钩子函数,我们可以在该函数执行onload函数或其他需要执行的操作。 ### 回答2: VueTab切换组件是用来在多个页面之间进行切换显示的,而Vant List组件是用于展示一组数据的列表。通常情况下,Vue的Tab切换不会触发页面的加载事件,而只是进行显示与隐藏的切换。 所以,如果你希望在Tab切换执行某些操作,可以通过监听Tab切换事件,在事件回调函数进行相应的处理。例如,可以使用Vue的`@change`事件来监听Tab切换: ``` <van-tab @change="onTabChange"> <van-tab-item title="Tab1"></van-tab-item> <van-tab-item title="Tab2"></van-tab-item> </van-tab> ``` 在`onTabChange`方法,可以添加需要执行的逻辑: ``` methods: { onTabChange(index) { // 根据 index 来执行相应的操作 if (index === 0) { // 切换到第一个Tab执行的操作 } else if (index === 1) { // 切换到第二个Tab执行的操作 } } } ``` 这样,当切换Tab,就会触发`onTabChange`方法,并且可以根据Tab的索引值来执行不同的操作。 需要注意的是,Vant List组件的加载可以在页面初始化执行,而不是依赖于Tab切换事件。所以,如果希望在Tab切换Vant List页面执行加载逻辑,可以在Vant List组件的`created`或`mounted`生命周期钩子函数执行相应的操作。例如: ``` <van-tab-item title="List"> <van-list :finished="finished" @load="onLoad"></van-list> </van-tab-item> ... methods: { onLoad() { // 加载更多数据的逻辑 } }, mounted() { this.onLoad(); } ``` 以上是一种基本的解决方案,当然根据具体的需求和情况,可能还需要根据实际情况进行调整和扩展。 ### 回答3: 在Vue使用vant-lit组件进行tab切换,遇到不执行onload的问题,可能是由于组件的更新机制导致的。 Vue组件更新是根据组件数据的变化来决定是否更新视图的。在进行tab切换,组件的数据可能有发生变化,所以不会触发onload事件。 解决这个问题的一种方法是使用Vue的watch属性来监听tab的变化,然后在变化手动触发onload事件。具体步骤如下: 1. 在data定义一个变量来保存当前选tab值,例如currentTab。 2. 使用watch属性来监听currentTab的变化。 3. 在watch属性的回调函数手动触发onload事件,可以通过$nextTick方法来确保在更新DOM后触发。 示例代码如下: ```javascript data() { return { currentTab: 'tab1' } }, watch: { currentTab(newValue, oldValue) { // 手动触发onload事件 this.$nextTick(() => { this.onload(); }); } }, methods: { onload() { // 执行需要在tab切换执行的操作 } } ``` 通过以上方法,就可以在Vue实现tab切换执行onload事件了。需要注意的是,在使用watch监听tab变化,可能会多次触发回调函数,可以通过判断newValue和oldValue的值来决定是否执行onload

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值