广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue如何混入mixins滚动触底
  • 907
分享到

Vue如何混入mixins滚动触底

2024-04-02 19:04:59 907人浏览 安东尼
摘要

这篇文章主要介绍了Vue如何混入mixins滚动触底,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在app端常常看到类似加载数据的动画,

这篇文章主要介绍了Vue如何混入mixins滚动触底,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

在app端常常看到类似加载数据的动画,接下来我们来实现滚动触底加载动画提示,以及如何复用这些逻辑。

Vue如何混入mixins滚动触底

如何判断滚动触底

来看下几张图:

情况一:

当文档高度还为超过可视区域高度时,不存在滚动,所以也没有滚动触底

Vue如何混入mixins滚动触底 

情况二:

当文档高度超过可视区域的高度时,还有剩余的文档没有滚动完,也就是说 可视区域高度 + 滚动高度 < 文档高度 ,此时没有达到滚动触底的条件

Vue如何混入mixins滚动触底 

情况三:

文档高度大于可视区域,并且滚动到文档底部, 也就是说 可视区域高度 + 滚动高度 = 文档高度

Vue如何混入mixins滚动触底 

判断是否滚动到底

经过上面三种情况的分析,我们需要拿到 可视区域的高度 , 滚动高度 , 文档高度 这三个变量来进行比较。

可视区域的高度

function getWindowHeight() {
 return document.documentElement.clientHeight;
}

滚动高度

对有doctype申明的页面使用document.documentElement.scrollTop,safari特例独行:使用 window.pageYOffset

function getScrollHeight() {
 return Math.max(document.documentElement.scrollTop,window.pageYOffset||0)
}

文档高度

function getDocumentTop() {
 return document.documentElement.offsetHeight;
}

代码实现

触底打印

codepen 触底打印demo

通过监听滚动事件来判断 可视区域滚动高度文档高度 的关系,实现最基础的触底加载

 <div id="app">
 <ul>
  <li v-for="item in list" :key="item" > {{item}}</li>
 </ul>
 </div>
 created(){
  // 初始化数据
  this.list = Array.from(Array(10),(item,index)=>index)
  // 通过监听滚动事件来判断 可视区域 , 滚动高度 ,文档高度的关系
  window.addEventListener('scroll',()=>{
  let isBottom = (getScrollHeight() + getWindowHeight()) >= getDocumentTop()
  if(isBottom){
   console.log('触底了',new Date())
   let list = this.list
   let last = list[list.length-1]
   let newList = Array.from(Array(10),(item,index)=>index+last+1)
   this.list.push(...newList)
  }
  })
 }

优化和复用滚动事件逻辑

将滚动逻辑抽取成 mixins 放在 scroll.js 中。优化功能点如下:

  1. 增加触底距离

  2. 滚动事件监听事件节流

  3. 添加触底动画,并将 UI 样式一起封装在 scroll.js 中

 模拟请求事件

为了模拟请求数据,封装了一个 Promise 一秒后返回结果

methods:{
 // 返回一个 promise ,用于请求服务端数据
 findDataList(){
 let list = this.list
 let last = list[list.length-1]
 return new Promise((resolve)=>{
 // 模拟服务端数据
 let newList = Array.from(Array(10),(item,index)=>index+last+1)
  setTimeout(() => {
  resolve(newList)
  }, 1000);
 })
 }
}

滚动事件监听

滚动事件触发,判断当前是否触底,触底了以后去执行 loadMore 发起请求拿取服务端的数据

 created(){
 let fn = throttle(()=>{
  let isOver = (getScrollHeight() + getWindowHeight()) >= (getDocumentTop()- MIN_INSTANCE)
  // 触底时进行数据加载
  if(isOver){
  // 创建加载组件
  this.loadMore&&this.loadMore()
  }
 },DEALY_TIME)
 window.addEventListener('scroll',fn)
 },

添加触底动画

因为我们是将逻辑抽离在 mixins中,为了把触底动画也集成在里面使用 Vue.extend() 来实现编程式插入UI样式的方法。

首先定义好 loading 组件的样式

<template>
 <div id="loading-alert">
  <i class="el-icon-loading"></i>
  <span>{{ message }}</span>
 </div>
</template>

<script>
export default {
 props:{
 message:{
  type:String,
  default:'正在加载更多数据'
 }
 },
};

当触底时去插入这个 loading 组件

import load from './load.vue'
data(){
 return {
 isLoading:false,
 component:null
 }
},
created(){
 let fn = throttle(()=>{
 let isOver = (getScrollHeight() + getWindowHeight()) >= (getDocumentTop()- MIN_INSTANCE)
 // 触底时进行load组件显示
 if(isOver){
  // 判断loading组件是否已经存在,不存在就创建一个
  if(!this.component){
  this.component = extendComponents(load)
  }
  // 创建加载组件
  this.loadMore&&this.loadMore()
  // 判断当前状态来控制loading的组件显示与否
  if(!this.isLoading){
  this.component.$el.remove()
  // 将loading组件置为空
  this.component = null
  }
 }
 },DEALY_TIME)
 window.addEventListener('scroll',fn)
},

感谢你能够认真阅读完这篇文章,希望小编分享的“Vue如何混入mixins滚动触底”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网JavaScript频道,更多相关知识等着你来学习!

--结束END--

本文标题: Vue如何混入mixins滚动触底

本文链接: https://www.lsjlt.com/news/73948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue如何混入mixins滚动触底
    这篇文章主要介绍了Vue如何混入mixins滚动触底,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在app端常常看到类似加载数据的动画,...
    99+
    2022-10-19
  • Vue mixins混入如何使用
    这篇文章主要介绍了Vue mixins混入如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue mixins混入如何使用文章都会有所收获,下面我们一起来看看吧。一、什么是Mixins...
    99+
    2023-07-05
  • vue如何监听滚动条到底部
    这篇文章主要介绍“vue如何监听滚动条到底部”,在日常操作中,相信很多人在vue如何监听滚动条到底部问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何监听滚动条到底部”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-04
  • 如何实现vue进入页面时滚动条始终在底部
    这篇文章将为大家详细讲解有关如何实现vue进入页面时滚动条始终在底部,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下mounted () {...
    99+
    2022-10-19
  • 微信小程序组件scroll-view滚动到底部多次触发加载如何解决?
    在 iOS 真机上,scroll-view 滚动时会多次触发 scrolltolower 事件的问题,可以设置一个“加载标识”(如 DisableTrigger)来避免重复请求下一页数据。具体做法为:...
    99+
    2023-09-06
    小程序
  • vue中如何实现进入详情页记住滚动位置
    这篇文章主要为大家展示了“vue中如何实现进入详情页记住滚动位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中如何实现进入详情页记住滚动位置”这篇文章吧...
    99+
    2022-10-19
  • vue如何实现每次渲染完页面后div的滚动条保持在最底部
    这篇文章主要介绍vue如何实现每次渲染完页面后div的滚动条保持在最底部,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下://每次页面渲染完之后滚动条在最底部 updated:...
    99+
    2022-10-19
  • 如何解决vue进入页面时不在顶部以及检测滚动返回顶部按钮的问题
    小编给大家分享一下如何解决vue进入页面时不在顶部以及检测滚动返回顶部按钮的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!这...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作