vue实现滑动到底部加载更多效果

本文实例为大家分享了vue实现滑动到底部加载更多的具体代码,供大家参考,具体内容如下

思路:

如果可视区的高度域dom元素的getBoundingClientRect().bottom高度相同说明已经到了底部,可以实现加载了

template:

<template>
 <div class="content">
  <div class="logo">
   <div>
    <img v-if="server[0].thUintroduceLogo" :src="setIp + server[0].thUintroduceLogo" alt="">
    <img v-if="!server[0].thUintroduceLogo" src="../../../assets/images/shooping/u538.png" alt="">
   </div>
   <div>
    <span>{{server[0].companyName}}</span>
   </div>
   <div @click="callCustomer()">
    <img src="../../../assets/images/shooping/u37.png" alt=""> 致电客服
   </div>
  </div>
  <div class="info">
   <div class="swipe">
    <mt-swipe ref="swipe" :auto="0" :showIndicators="false" @change="swipeChange">
     <mt-swipe-item v-for="(item,index) in server[0].thUintroduceImg.split(',')" :key="index">
      <div class="jcc">
       <img :src="setIp + item" alt="">
      </div>
     </mt-swipe-item>
    </mt-swipe>
    <span class="index">{{activeIndex}}/{{server[0].thUintroduceImg.split(',').length}}</span>
   </div>
   <div class="info1">
    <p>{{server[0].thUintroduceText}}</p>
    <span @click="hidden()" v-if="show"> <i>......</i> 展开</span>
   </div>
  </div>
  <div class="shopping">
   <h4>
    <img src="../../../assets/images/shooping/u19.png" alt="">
    <span>全部商品</span>
   </h4>
   <img src="../../../assets/images/shooping/split.jpg" alt="">
  </div>
  <div>
   <div ref="my_pull" class="listUl">
    <div v-for="item in server" :key="item.pId" class="itemLIST" @click="pushInfo(item)">
     <div>
      <img :src="setIp + item.pImgeOne" alt="">
     </div>
     <div>
      <h3>{{item.pTitle}}</h3>
      <p>
       <span>已售{{item.pSaleNums}}件</span>
       <span v-if="!isMemberId">价格登录可见</span>
       <span v-if="isMemberId">¥{{item.uPrice}}</span>
      </p>
     </div>
    </div>
    <!-- <div v-for="item in 10" :key="item" style="height:100px">{{item}}</div> -->
   </div>
  </div>
  <div v-if="isbottom == -1" class="isbottom">
   <i class="iconfont icon-jiazai1"></i>
   <span>加载中,请稍后</span>
  </div>
  <div v-if="isbottom == 1" class="isbottom">
   <span>没有更多数据了</span>
  </div>
 </div>
</template>

script:

<script>
 import {
  Swipe,
  SwipeItem,
  Popup
 } from 'mint-ui'
 export default {
  data: () => ({
   server: [],
   page: 1,
   clientHeight: 0,
   el: {},
   isbottom: 0,
   show: true,
   activeIndex: 1
  }),
  created() {
   this.getServer()
  },
  beforeDestroy() {
   let title = document.querySelector("#title")
    title.style.background = "#6a7d8f";
    let arr = document.querySelector(".is-left")
    arr.style.color = "#fff"
  },
  computed: {
   isMemberId() {
    return this.$store.state.isMemberId
   }
  },
  mounted() {
   this.clientHeight = document.documentElement.clientHeight
   this.$nextTick(() => {
    let title = document.querySelector("#title")
    title.style.background = "#fff";
    let arr = document.querySelector(".is-left")
    arr.style.color = "#333"
    this.el = this.$refs.my_pull;
    window.addEventListener('scroll', this.handleScroll)
   })
  },
  methods: {
   callCustomer() {
    let msg = this.server[0].thServicePhone;
    $App.callCustomer(msg);
   },
   swipeChange() {
    this.activeIndex = this.$refs.swipe.index + 1
   },
   hidden() {
    let el = document.querySelector(".info1")
    el.style.height = "auto"
    this.show = false
   },
   pushInfo(item) {
    this.$store.dispatch("newshoppingInfo", item)
    console.log(this.$store.state.shoppingInfo);
    this.$router.push({
     path: "/shooping/shoopingInfo",
    })
   },
   handleScroll() {
    let a = this.el.getBoundingClientRect().bottom;
    a = Math.ceil(a);
    if (a == this.clientHeight) {
     this.isbottom = -1
     this.page++
      this.getServer()
    }
   },
   // 获取后台数据
   getServer() {
    $App.showWebActivity();
    this.$http.post(this.root + 'agriculture/xxxxxxxxx', {
     key: this.zkey,
     code: this.zcode,
     page: this.page,
     rows: 4,
     townsid: sessionStorage.getItem("villageId"),
     pUid: sessionStorage.getItem("shoppingUid")
    }, {
     emulateJSON: true
    }).then((res) => {
     $App.dismissWebActivity()
     if (res.body.code == 100) {
      if (this.page == 1) {
       this.server = res.body.list.rows;
      } else {
       this.server = this.server.concat(res.body.list.rows)
      }
      if (res.body.list.rows.length >= 4) {
       this.isLast = false
      } else {
       this.isLast = true;
       this.isbottom = 1
       window.removeEventListener('scroll', this.handleScroll)
      }
     } else {
      $App.toastWebActivity(res.body.message)
      console.log(res)
     }
    }, (err) => {
     $App.dismissWebActivity()
    })
   },
  },
 }
</script>

style:

<style lang="less" scoped>
 .content {
  .isbottom {
   display: flex;
   align-items: center;
   justify-content: center;
   padding: 15px 0;
   color: #999;
   i {
    font-size: 30px;
    animation: rotate 1s infinite;
   }
   span {
    color: #ccc;
    padding-left: 15px;
   }
  }
  .logo {
   background: #fff;
   padding-bottom: 15px;
   div {
    &:nth-child(1) {
     display: flex;
     justify-content: center;
     img {
      width: 60px;
      height: 60px;
     }
    }
    &:nth-child(2) {
     text-align: center;
     padding: 15px 15px;
     color: #609bf0;
    }
    &:nth-child(3) {
     display: flex;
     justify-content: center;
     align-items: center;
     color: #1296db;
     border: #1296db 1PX solid;
     width: 50%;
     margin: 0 auto;
     padding: 5px 0;
     font-size: 15px;
     img {
      width: 20px;
      height: 20px;
      margin-right: 8px;
     }
    }
   }
  }
  .info {
   background: #fff;
   margin-bottom: 10px;
   padding-bottom: 15px;
   .swipe {
    height: 300px;
    background: #eee;
    position: relative;
    .jcc {
     display: flex;
     justify-content: center;
     height: 300px;
    }
    img {
     // width: 100%;
     height: 100%;
    }
    .index {
     position: absolute;
     background: rgba(243, 244, 245, .8);
     padding: 5px 15px;
     bottom: 10px;
     right: 10px;
     border-radius: 50px;
    }
   }
  }
  .info1 {
   background: #fff;
   position: relative;
   padding: 15px 9px 0;
   height: 79px;
   overflow: hidden;
   p {
    line-height: 22px;
    text-indent: 2em;
    letter-spacing: 1.2px;
   }
   span {
    width: 75px;
    text-align: right;
    position: absolute;
    bottom: 0;
    right: 9px;
    color: #39c;
    background: #fff;
    i {
     color: #333;
    }
   }
  }
  .shopping {
   background: #fff;
   padding-top: 15px;
   h4 {
    display: flex;
    align-items: center;
    justify-content: center;
    padding-bottom: 10px;
    >img {
     width: 30px;
     height: 30px;
     margin-right: 10px;
    }
    span {
     color: #0f589e;
     font-weight: normal;
    }
   }
   img {
    display: block;
    width: 100%;
    height: 2px;
   }
  }
  .listUl {
   // display: flex;
   // flex-wrap: wrap;
   padding: 0 15px;
   top: 60px;
   height: calc(100% - 100px) !important;
   background: #fff;
   overflow: hidden;
   .itemLIST {
    // float: left;
    width: 50%;
    display: inline-block;
    padding-top: 15px;
    padding-bottom: 15px;
    &:nth-child(2n) {
     padding-right: 5px;
    }
    &:nth-child(2n -1) {
     padding-left: 5px;
    }
    img {
     // width: 100%;
     height: 100%;
     /* prettier-ignore */
     // border: 1PX solid #eee;
    }
    div {
     &:first-child {
      overflow: hidden;
      height: 160px;
      display: flex;
      align-items: center;
      justify-content: center;
     }
     &:last-child {
      h3 {
       font-weight: normal;
       font-size: 16px;
       margin-top: 5px;
       text-overflow: ellipsis;
       white-space: nowrap;
       overflow: hidden;
      }
      p {
       font-size: 14px;
       margin-top: 5px;
       display: flex;
       align-items: center;
       justify-content: space-between; // padding: 0 15px;
       padding-right: 10px;
       span {
        display: block;
        &:first-child {
         color: #888;
        }
        &:last-child {
         color: red;
         font-size: 16px;
        }
       }
      }
     }
    }
   }
  }
 }
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue移动UI框架滑动加载数据的方法

    前言 在我们移动端还有一个很常用的组件,那就是滑动加载更多组件.平常我们看到的很多插件实现相当复杂就觉得这个组件很难,其实不是的!!这个组件其实可以很简单的就实现出来,而且体验也能非常的棒(当然我们没有实现下拉刷新功能)!!下面我们就一起来实现这个组件. 效果展示 先上一个gif图片展示我们做成后的效果,如下: DOM结构 页面应该包含三个部分:1. 正文区域 2.加载小菊花以及记载文字 3.所有数据加载完成后的文字: <div ref="scroll" class="

  • vue loadmore 组件滑动加载更多源码解析

    上一篇讲到在项目中使用上拉加载更多组件,但是由于实际项目开发中由于需求变更或者说在webview中上拉加载有些机型在上拉时候会把webview也一起上拉导致上拉加载不灵敏等问题,我们有时候也会换成滑动到底部自动加载的功能. 既然都是加载更多,很多代码思想势必相似,主要区别在于上拉和滑动到底部这个操作上,所以,我们需要注意: 上拉加载是point指针touch触摸事件,现在因为是滑动加载,需要添加scroll事件去监听然后执行相应回调 上拉加载主要计算触摸滚动距离,滑动加载主要计算containe

  • vue实现滑动到底部加载更多效果

    本文实例为大家分享了vue实现滑动到底部加载更多的具体代码,供大家参考,具体内容如下 思路: 如果可视区的高度域dom元素的getBoundingClientRect().bottom高度相同说明已经到了底部,可以实现加载了 template: <template> <div class="content"> <div class="logo"> <div> <img v-if="server[0].t

  • vue底部加载更多的实例代码

    要实现的效果如下: <template> <div class="newsList"> <div v-for="(items, index) in newsList"> <div class="date">{{showDay(index)}}</div> <div class="list" > <ul> <li class="l

  • vue loadmore组件上拉加载更多功能示例代码

    最近在做移动端h5页面,所以分页什么的就不能按照传统pc端的分页器的思维去做了,这么小的屏幕去点击也不太方便一般来讲移动端都是上拉加载更多,符合正常使用习惯. 首先简单写一下模板部分的html代码,,很简单清晰的逻辑: <template> <div class="loadmore"> <div class="loadmore__body"> <slot></slot> </div> <d

  • XRecyclerView实现下拉刷新、滚动到底部加载更多等功能

    介绍: 一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView.使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater. 加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定. 项目地址:https://github.com/jianghejie/XRecyclerView 效果: 使用: xml <RelativeLayout xmlns:android="http://sc

  • vue实现的上拉加载更多数据/分页功能示例

    本文实例讲述了vue实现的上拉加载更多数据/分页功能.分享给大家供大家参考,具体如下: 加载状态 <div v-if='has_log == 0'> <load-more tip="上拉加载" :show-loading="false" background-color="#fbf9fe"></load-more> </div> <div v-if='has_log == 1'> <

  • 基于jQuery实现点击列表加载更多效果

    本文实例为大家分享了jQuery点击加载更多效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jquery s

  • Android RecyclerView添加上拉加载更多效果

    先看一下效果 刷新的时候是这样的: 没有更多的时候是这样的: 既然有刷新的时候有两种状态就要定义两个状态 //普通布局的type static final int TYPE_ITEM = 0; //脚布局 static final int TYPE_FOOTER = 1; 在特定的时候去显示: @Override public int getItemViewType(int position) { //如果position加1正好等于所有item的总和,说明是最后一个item,将它设置为脚布局

  • jQuery滑动到底部加载下一页数据的实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <script>page_num =page_num+1 ; //页码自动增加,保证下次调用时为新的一页. $.ajax({ type: "get", url: rent_url, data: '2', dataType: "json", success: function (data) { // 查询到的数据总数 rentDataNum = data.count // 每页加载6个 需要加载的页数

  • Vue中使用Openlayer实现加载动画效果

    注意:实现动画时不能有scoped!!!!  通过gif <template> <div class="test"> <div id="map" ref="map" style="width: 100vw; height: 100vh"></div> </div> </template> <script> import "ol/ol.

  • js实现滑动到页面底部自动加载更多功能

    话不多说,请看代码: //滚动条到页面底部加载更多案例 $(window).scroll(function(){ var scrollTop = $(this).scrollTop(); //滚动条距离顶部的高度 var scrollHeight = $(document).height(); //当前页面的总高度 var clientHeight = $(this).height(); //当前可视的页面高度 // console.log("top:"+scrollTop+"

随机推荐