VUE3.0自定义无限滚动组件

一、前言

参考https://blog.youkuaiyun.com/weixin_26717681/article/details/108892649这个做的

二、代码

<template>
  <mycard class="wuxiangundong my-2 py-2 bg-white flex justify-center items-center" ref="wuxiangundong">
    <div class="w-full px-3 mt-1 flex justify-center items-center h-10" v-if="nomore">
      <span class="text-gray-200 select-none">{{completeText}}</span>
    </div>
  </mycard>
</template>

<script lang="ts">
import {defineComponent, onMounted,onUnmounted, ref} from "vue";
export default defineComponent({
  name:"wuxiangundong",
  props:{
    // 加载状态图标
    loadIcon:{
      default:"el-icon-loading",
      typr:String,
    },
    // 加载完成文字
    completeText:{
      default:"没有更多了",
      type:String,
    },
    // 是否触发加载,这个应该没什么用
    jiazaistatus:{
      default: true,
      type:Boolean,
    },
    // 组件挂载完成后,是否立即加载一次
    mashang:{
      default: false,
      type:Boolean,
    },
  },
  setup(prop,context) {
    // 整个标签
    const wuxiangundong:any = ref(null)
    // 显示没有更多
    const nomore = ref(false)
    // 节流状态,默认开启,等待父组件第一次加载结束,关闭节流
    const jieliu = ref(true)
    // 添加监听
    onMounted(() => {
      if(prop.mashang){
        loadMorePosts()
      }
      window.addEventListener("scroll", yanshi)
    })
    // 移除监听
    onUnmounted(() => {
      window.removeEventListener("scroll", yanshi)
    })
    // 触发父组件方法,显示加载图标
    function loadMorePosts(){
      wuxiangundong.value.startload()
      context.emit("get")
    }
    // 获取实时位置
    const handleScroll = ()=>{
      if(!jieliu.value && !nomore.value) {
        console.log("触发一次",jieliu2,jieliu.value,nomore.value)
        const julidibu = document.documentElement.clientHeight + document.documentElement.scrollTop - wuxiangundong.value.$el.offsetTop - wuxiangundong.value.$el.offsetHeight
        if (julidibu > -150) {
          jieliu.value = true
          loadMorePosts()
        }
      }
    }
    let jieliu2 = false
    // 设置延时
    function yanshi(){
      if(!jieliu2 && !jieliu.value) {
        console.log("延时执行一次",jieliu2,jieliu.value,nomore.value)
        jieliu2 = true
        handleScroll()
        setTimeout(() => {
          jieliu2 = false
        }, 400)
      }
    }
    // 父组件完成加载,将节流状态关闭,加载图标关闭,卡片的全局加载关闭
    function completejieliu(){
      jieliu.value = false
      wuxiangundong.value.closeload()
    }
    // 父组件不再加载,显示没有更多,关闭加载图标,关闭卡片全局加载
    function notget(){
      nomore.value = true
      wuxiangundong.value.closeload()
    }
    return {
      wuxiangundong,
      nomore,
      completejieliu,
      notget,
    }
  },
  components:{},
})
</script>

<style scoped>
</style>

我使用的tailwindcss,所有的css都写在html里面了。可以看到很简单的几个class。

三、使用方法

<InfiniteRolling @get="getnewdongtai" ref="mygundong"></InfiniteRolling>


 setup() {
    // 无限滚动ref
    const mygundong:any = ref(null)
    // 滚动加载方法
    function getdate(){
      for (let i=0;i<20;i++){
        newdate.value.push(ceshi.value)
      }
      if(newdate.value.length >= 100){
        mygundong.value.notget()
      }else{
        mygundong.value.completejieliu()
      }
    }
    return{
		mygundong,
		getdate,
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值