返回顶部
首页 > 资讯 > 精选 >vue无限加载指令怎么实现
  • 902
分享到

vue无限加载指令怎么实现

2023-07-04 12:07:32 902人浏览 八月长安
摘要

本文小编为大家详细介绍“Vue无限加载指令怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue无限加载指令怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue 中的自定义指令是对底层 dom 进

本文小编为大家详细介绍“Vue无限加载指令怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue无限加载指令怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

vue 中的自定义指令是对底层 dom 进行操作,下面以实现滚动到底部加载数据,实现无限加载来介绍如何自定义一个简单的指令。

无限加载的原理是通过对滚动事件的监听,每一次滚动都要获取到已滚动的距离,如果滚动的距离加上浏览器窗口高度,会大于等于内容高度,就触发函数加载数据。

先介绍不使用 vue 的情况如何实现无限加载。

不使用框架

首先是html

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>实现滚动加载</title><style> * {  -WEBkit-box-sizing: border-box;  -moz-box-sizing: border-box;  box-sizing: border-box;  } li, ul {  list-style: none; } .container {  width: 980px;  margin: 0 auto; } .news__item {  height: 80px;  margin-bottom: 20px;  border: 1px solid #eee; }</style></head><body><div class="container"> <ul class="news" id="news">  <li class="news__item">1、hello world</li>  <li class="news__item">2、hello world</li>  <li class="news__item">3、hello world</li>  <li class="news__item">4、hello world</li>  <li class="news__item">5、hello world</li>  <li class="news__item">6、hello world</li>  <li class="news__item">7、hello world</li>  <li class="news__item">8、hello world</li>  <li class="news__item">9、hello world</li>  <li class="news__item">10、hello world</li> </ul></div></body></html>

打开浏览器,调整下浏览器窗口高度,让页面可以滚动。

先了解三个变量

  • document.body.scrollTop 滚动条滚动的距离

  • window.innerHeight 浏览器窗口高度

  • document.body.clientHeight 内容高度

对应上面的原理就是

window.addEventListener('scroll', function() { var scrollTop = document.body.scrollTop; if(scrollTop + window.innerHeight >= document.body.clientHeight) {  // 触发加载数据      loadMore(); }});function loadMore() { console.log('加载数据')'}

loadMore() 函数就是从接口获取到数据,组装 html,插入到原先到节点后面。

// 表示列表的序号var index = 10;function loadMore() { var content = ''; for(var i=0; i< 10; i++) {  content += '<li class="news__item">'+(++index)+'、hello world</li>'   } var node = document.getElementById('news'); // 向节点内插入新生成的数据   var oldContent =   node.innerHTML; node.innerHTML = oldContent+content;}

这样就实现了无限加载。

在 vue 中使用指令实现

为什么要用指令实现呢?好像只有指令是可以获取到底层 dom 的?而实现无限加载,是需要拿到内容高度的。

首先初始化一个项目,添加一个组件,用来显示列表。

// components/Index.vue<template> <div>  <ul class="news">   <li class="news__item" v-for="(news, index) in newslist">    {{index}}-{{news.title}}   </li>  </ul> </div></template><style> .news__item {  height: 80px;  border: 1px solid #ccc;  margin-bottom: 20px; }</style><script> export default{  data(){   return{    newslist: [     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'},     {title: 'hello world'}    ]   }  } }</script>

OK,现在开始编写指令。从传统实现中,我们了解到要注册对滚动事件对监听,同时拿到内容高度。

directives: { scroll: {  bind: function (el, binding){   window.addEventListener('scroll', ()=> {    if(document.body.scrollTop + window.innerHeight >= el.clientHeight) {     console.log('load data');    }   })  } }}

首先是在组件内注册了 scroll 指令,然后在指令第一次绑定到组件时,也就是对应着 bind钩子,注册滚动监听。

钩子函数就是一些生命周期改变时会调用的函数。bind 在第一次绑定到组件时调用、unbind 在指令与组件解绑时调用。

还可以注意到 bind 对应到函数有两个参数,el 和 binding,这是钩子函数参数,比如 el 对应绑定的节点,binding 有很多数据,比如传给指令的参数等。

下面的el.clientHeight就是表示获取绑定指令的这个节点的内容高度。

和之前一样,判断滚动的高度加上窗口高度是否大于内容高度。

绑定指令到节点上:

<template> <div v-scroll="loadMore">  <ul class="news">   <li class="news__item" v-for="(news, index) in newslist">    {{index}}-{{news.title}}   </li>  </ul> </div></template>

可以看到给指令传了一个值,这个值就是加载数据的函数:

methods: { loadMore() {  let newAry = [];  for(let i = 0; i < 10; i++) {   newAry.push({title: 'hello world'})  }  this.newslist = [...this.newslist, ...newAry]; }}

当然,现在在滚动到底部时,只会打印load data,只要把这里改成调用函数就OK了:

 window.addEventListener('scroll', ()=> {  if(document.body.scrollTop + window.innerHeight >= el.clientHeight) {    let fnc = binding.value;    fnc();  }})

v-scroll="loadMore"的 loadMore可以在钩子函数参数的 binding 上拿到。

至此,一个简单的指令就完成了。

优化

上面的例子并没有真正从接口获取数据,所以存在一个隐藏的 bug:当接口响应很慢的情况,滚动到底部正在加载数据时,稍微滚动一下仍会触发获取数据函数,这会造成同时请求多次接口,一次性返回大量数据。

解决办法是添加一个全局变量 scrollDisable,当第一次触发加载数据函数时,将该值设置为 true,根据该值判断是否要执行加载函数。

以普通实现为例:

var scrollDisable = false;window.addEventListener('scroll', function() { var scrollTop = document.body.scrollTop; if(scrollTop + window.innerHeight >= document.body.clientHeight) {  // 触发加载数据      if(!scrollDisable) {   //    loadMore();   }  }});// 表示列表的序号var index = 10;function loadMore() {  // 开始加载数据,就不能再次触发这个函数了 scrollDisable = true; var content = ''; for(var i=0; i< 10; i++) {  content += '<li class="news__item">'+(++index)+'、hello world</li>'   } var node = document.getElementById('news'); // 向节点内插入新生成的数据   var oldContent =   node.innerHTML; node.innerHTML = oldContent+content; // 插入数据完成后   scrollDisable = false;}

Vue的优点

Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快等优势,Vue中页面使用的是局部刷新,不用每次跳转页面都要请求所有数据和dom,可以大大提升访问速度和用户体验。

读到这里,这篇“vue无限加载指令怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: vue无限加载指令怎么实现

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

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

猜你喜欢
  • vue无限加载指令怎么实现
    本文小编为大家详细介绍“vue无限加载指令怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue无限加载指令怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue 中的自定义指令是对底层 dom 进...
    99+
    2023-07-04
  • 如何实现一个vue无限加载指令
    这篇文章给大家分享的是有关如何实现一个vue无限加载指令的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue 中的自定义指令是对底层 dom 进行操作,下面以实现滚动到底部加载数...
    99+
    2024-04-02
  • Vue怎么实现无限加载瀑布流
    这篇文章主要介绍“Vue怎么实现无限加载瀑布流”,在日常操作中,相信很多人在Vue怎么实现无限加载瀑布流问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么实现无限加载瀑布流”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-25
  • Vue实现无限加载瀑布流
    本文实例为大家分享了Vue实现无限加载瀑布流的具体代码,供大家参考,具体内容如下 我做的这个瀑布流放在了一个嵌套页面里,就是类似管理后台的main content中,如果要改成全屏...
    99+
    2024-04-02
  • vue如何自定义加载指令
    本文小编为大家详细介绍“vue如何自定义加载指令”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue如何自定义加载指令”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言用过element-ui的都应该知道,里面...
    99+
    2023-07-02
  • PHP+InfiniteScroll网页无限滚动加载数据怎么实现
    这篇文章主要介绍“PHP+InfiniteScroll网页无限滚动加载数据怎么实现”,在日常操作中,相信很多人在PHP+InfiniteScroll网页无限滚动加载数据怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-06-04
  • js实现瀑布流布局(无限加载)
    本文实例为大家分享了js实现瀑布流布局的具体代码,供大家参考,具体内容如下 1.实现瀑布流布局思路 准备好数据之后 . 绑定滚动事件 . 判断页面是否到底(滚动的距离+可是区域的高度...
    99+
    2024-04-02
  • vue怎么实现无限消息无缝滚动
    本篇内容主要讲解“vue怎么实现无限消息无缝滚动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue怎么实现无限消息无缝滚动”吧!一、html<div class="t...
    99+
    2023-06-29
  • HTML5怎么实现图片无限加载的瀑布流效果
    本篇内容主要讲解“HTML5怎么实现图片无限加载的瀑布流效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5怎么实现图片无限加载的瀑布流效果”吧!代码如...
    99+
    2024-04-02
  • vue-router中怎么实现路由懒加载和权限控制
    今天就跟大家聊聊有关vue-router中怎么实现路由懒加载和权限控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、为什么要使用路由懒加载呢用v...
    99+
    2024-04-02
  • Vue中怎么实现按需加载
    本篇文章给大家分享的是有关Vue中怎么实现按需加载,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。概念(懒加载)当打包构建应用时,JavaScr...
    99+
    2024-04-02
  • Vue怎么实现图片懒加载
    本篇内容主要讲解“Vue怎么实现图片懒加载”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么实现图片懒加载”吧! 1.下载 npm i vue-laz...
    99+
    2024-04-02
  • vue怎么实现路由懒加载
    这篇文章主要介绍了vue怎么实现路由懒加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。路由懒加载写法: // 我所采用...
    99+
    2024-04-02
  • Vue简易版无限加载组件实现原理与示例代码
    目录背景实现功能Props使用组件实现scroll 事件$emit 发射事件和 props 回调函数的区别总结背景 遇到的两个问题:scroll 事件不触发、如何将 loading ...
    99+
    2024-04-02
  • HTML5怎样实现图片无限加载瀑布流效果
    这篇文章主要介绍了HTML5怎样实现图片无限加载瀑布流效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:<!DOCTYPE&...
    99+
    2024-04-02
  • vue自定义加载指令v-loading占位图指令v-showimg
    目录了解自定义指令的钩子函数注册成为全局指令需求描述列表组件 ListCom.vue加载动画组件 LoadingCom.vue钩子函数 loading.js分析上面的代码main.j...
    99+
    2022-11-13
    vue自定义加载占位图指令 vue自定义指令
  • 权限管理模块中动态加载Vue组件怎么实现
    本篇内容介绍了“权限管理模块中动态加载Vue组件怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!登录状态保存当用户登录成功之后,需要将...
    99+
    2023-06-19
  • Vue中自定义图片懒加载指令
    本篇文章为大家展示了Vue中自定义图片懒加载指令,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先看如何使用这个指令:  <img v-lazyloa...
    99+
    2024-04-02
  • vue自定义加载指令最新详解
    目录前言创建加载组件创建指令指令文件创建构造器书写指令开启函数关闭函数前言 用过element-ui的都应该知道,里面有一个loading组件,有两种调用方法:指令和服务。但是只有一...
    99+
    2024-04-02
  • vue指令怎么实现组件通信
    本教程操作环境:Windows10系统、Vue 3版、DELL G3电脑vue指令怎么实现组件通信?Vue实现组件间通信的七种方式1. props / $emit父组件通过props的方式向子组件传递数据,而通过$emit 子组件可以向父组...
    99+
    2023-05-14
    Vue
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作