【vant】van-list的滚动加载onload事件

1.van-list的滚动加载onload事件:onload莫名执行多次或者一直加载到所有数据。
2.官方说了,不能使用float和overflow。包括父级元素和html和body都不要用这些触发BFC的属性
3.滑动到底部会触发该事件(一定要注意父级标签,甚至 html 和 body 标签都不能设置overflow,第一次加载一定要保证数据能撑出这个页面(多加载几条或者没调高度设置高点))
4.:immediate-check=“false” 阻止默认就加载 改为在created里再加载首次

以下代码可直接复制

<template>
  <div class="order-sure">

    <div class="search_box">
      <form action="/">
        <van-search label="投保人" v-model="searchObj.applicantName" show-action placeholder="请输入投保人" @blur="onSearch1" @clear="onCancel1" @cancel="onCancel1" />
      </form>
    </div>

    <!-- // 滑动到底部会触发该事件(一定要注意父级标签,甚至 html 和 body 标签都不能设置overflow,第一次加载一定要保证数据能撑出这个页面(多加载几条或者没调高度设置高点)) -->
    <!-- :immediate-check="false" 阻止默认就加载 改为在created里再加载首次 -->
    <van-list class="van-list" v-model="loading" :finished="finished" finished-text="没有更多了" :immediate-check="false" @load="onLoad">
      <div v-for="(item,index) in list" :key="index" class="div_box">
        <div class="div_1">
          <span class="s1">投保人:{{index}}</span>
          <span class="s2">{{item.applicantName}}</span>
        </div>
      </div>
    </van-list>

  </div>
</template>

<script>

import { Toast } from 'vant'


export default {
  name: 'order-sure',
  data () {
    return {
      searchObj: {
        applicantName: '',
        licenseNo: '',
        pageIndex: 1,
        pageSize: 10,
      },
      value: '',
      total: 0,

      list: [],
      loading: false,
      finished: false,

    }
  },
  created () {
    this.searchObj.pageIndex = 1
    this.searchObj.pageSize = 10
    this.list = []
    this.onLoad()
  },
  methods: {
    onSearch1 (e) {
      console.log(e)
      // Toast(e.target.value)
      this.resetPage()
    },
    onCancel1 () {
      Toast('取消')
      this.resetPage()
    },
    resetPage () {
      this.searchObj.pageIndex = 1
      this.searchObj.pageSize = 10
      this.list = []
      this.finished = false
      this.onLoad()
    },

    // 滑动到底部会触发该事件(一定要注意父级标签,甚至 html 和 body 标签都不能设置overflow,第一次加载一定要保证数据能撑出这个页面(多加载几条或者没调高度设置高点))
    onLoad () {
      console.log('onLoad')
      // 异步更新数据
      // setTimeout 仅做示例,真实场景中一般为 ajax 请求
      setTimeout(() => {

        // 真正调用接口 ---- 1 (打开此注释时候 关闭2部分逻辑)
        // PayPost(G_CGI_PHP.invoiceApi.mobileInvoicePolicyList, this.searchObj).then((res) => {
        //   if (res.success) {
        //     this.total = res.data.total
        //     this.list = [...this.list, ...res.data.list]
        //   } else {
        //     Toast(res.return_message)
        //   }
        //   // 加载状态结束
        //   this.loading = false
        // })

        // 模拟调接口数据  ----- 2
        for (let i = 0; i < 10; i++) {
          this.list.push({
            applicantName: 'applicantName',
            licenseNo: 'licenseNo',
            createdTime: 'createdTime',
          })
        }
        // 加载状态结束
        this.loading = false
        this.total = 43





        // 数据全部加载完成(就将finished设置为true 这样滑动到底部也不会触发加载onload事件) --- 3 需要保留的部分
        console.log(this.list.length >= this.total)
        if (this.list.length >= this.total) {
          this.finished = true
        } else {
          this.searchObj.pageIndex++
        }
      }, 500)
    },

  }

}
</script>
<style lang="less" scoped>
.order-sure {
  margin: 0 6px;

  .search_box {
    margin-top: 0.5rem;
  }
  .van-list {
    overflow: hidden;
  }
  .div_box {
    overflow: hidden;
    padding: 0.2333rem 0;
    box-sizing: border-box;

    height: 2.5rem;
    border-bottom: 1px solid #ddd;

    .div_1 {
      margin-top: 0.4rem;
    }

    span {
      font-size: 0.32rem;
    }

    .s1 {
      font-weight: 600;
    }
    .s2 {
      color: rgb(51, 50, 50);
    }
  }
  .div_box:first-child {
    border-top: 1px solid #ddd;
  }
}
</style>


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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: Vue中的Tab切换组件是用来在多个页面之间进行切换显示的,而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、付费专栏及课程。

余额充值