vant list 懒加载 第一次进行load事件时,莫名的进行了两次load事件

当时我的代码是这样的:

<template>
    <div class="now">
        <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad" :immediate-check="true" offset="8">
            <!-- 组件内默认样式是将图片文字放在右边 -->
            <van-cell v-for="item in store.nowlist" :key="item.filmId" @click="handleRouter(item.filmId) ">
                <img :src="item.poster" alt="item.name" style="width: 150px; float:left;">
                <span>
                    {{ item.name }}
                </span>

                <!-- 法三: 既然是van-cell组件的默认样式不喜欢,就不用van-cell组件,直接用div 包裹img span标签自定义样式 -->
            </van-cell>
        </van-list>
    </div>
</template>

<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import useNowStore from '../../store/nowStore'
import { List as vanList, Cell as vanCell } from 'vant' //vant 组件

const store = useNowStore()
const router = useRouter()
const loading = ref(false)    //加载状态
const finished = ref(false)    //服务端数据是否接收完 ,如果接收完 值为true
const pageNum = ref(1)   //后端数据第几页的数据
const total = ref(0)   //接收到数据的长度,判断服务端数据是否接收完,如果接收完将设置finished值为true

const handleRouter = (id) => {
    router.push(`/detail/${id}`)
}

// 滚动到底部触发更新
const onLoad = async() => {
    // 表示数据全部取出,停止load事件
    if(total.value >=54){
        finished.value = true
        console.log('数据全部加载完')
        return 
    }
    total.value = await store.getNowList(pageNum.value)   //获取数据 并返回数据长度
    pageNum.value++
    console.log( total.value)
    loading.value = false     //每次执行onLoad方法时,loading值会自动变为true,表示不再触发load事件
    console.log('加载数据')
}
</script>


<style scoped>
* {
    padding: 0;
    margin: 0;
}

.now li {
    margin: 20px;
    list-style: none;
}

.now ul :last-child {
    margin-bottom: 50px;
}

/*vue3中但页面样式写法deep  在页面中将生成[data-v-586ab144] .van-cell__value 
表示父节点[data-v-586ab144]中的子节点.van-cell__value的样式,这样就覆盖了原本样式*/
:deep(.van-cell__value) {
    text-align: left;
}

/*
:deep(.van-cell) {
    min-width: 50px;
    min-height: 80px;
}
*/
</style>

 load事件起初进行了两次,为什么呢?

直到看到这篇文章,原来是样式的问题。

原因是:图片是由异步加载过程,当图片没到onload事件时候,它没渲染出来,宽高只有0,0。vant 的触底事件判断又在此之前。就会瞬间判断没填满当前空间,就会立刻又加载一次。

后来我给盒子设置了最小高度就成功了!

/*vue3中但页面样式写法deep  在页面中将生成[data-v-586ab144] .van-cell__value 
表示父节点[data-v-586ab144]中的子节点.van-cell__value的样式,这样就覆盖了原本样式*/
:deep(.van-cell__value) {
    text-align: left;
}
:deep(.van-cell) {
    min-width: 50px;
    min-height: 80px;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果vue3 vant list 组件不触发上拉加载和onLoad事件,可能是以下原因: 1. 没有设置List组件的高度属性。 在List组件中,必须设置height属性,否则无法触发上拉加载功能。你可以设置一个固定的高度或者一个动态计算的高度,例如: ``` <van-list :height="500" @load="onLoad"></van-list> ``` 2. 没有设置List组件的loading属性。 loading属性是用来控制上拉加载的状态的,如果没有设置loading属性,上拉加载功能将无法正常工作。你可以在setup中定义一个ref变量来控制loading属性,例如: ``` <template> <van-list :height="500" :loading="loading" @load="onLoad"></van-list> </template> <script> import { ref } from 'vue'; export default { setup() { const loading = ref(false); const onLoad = () => { loading.value = true; // ... }; return { loading, onLoad, }; }, }; </script> ``` 3. 没有在List组件上绑定@load事件。 上拉加载的触发需要依赖@load事件,如果没有在List组件上绑定该事件,上拉加载功能将无法正常工作。你可以在List组件上绑定一个方法,例如: ``` <template> <van-list :height="500" :loading="loading" @load="onLoad"></van-list> </template> <script> import { ref } from 'vue'; export default { setup() { const loading = ref(false); const onLoad = () => { loading.value = true; // ... }; return { loading, onLoad, }; }, }; </script> ``` 如果以上方法都没有解决问题,你可以尝试检查控制台输出,查看是否有相关的错误信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值