vue组件中,监听页面滚动,实现吸顶效果,以及实现懒加载效果

实现吸顶效果

页面结构

在结构里,利用vue对象的ref绑定el-header(elementUI框架下的组件)

<template>
 <el-header ref="head" style="padding: .25rem .2rem">
      <div class="cityBox">广州市</div>
      <div class="inputBox"><input type="text" placeholder="搜索目的地国家/城市/关键词"></div>
      </el-header>
</template>

在mounted时期给window监听scrool滚动事件,并触发vue组件对象下的scroolToTop函数

<script>
export default{

methods(){
  scrollToTop(){
       var scrollTop = (window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop);//获取屏幕滚动距离
     if(scrollTop > 50px){//如果滚动大于0
       this.$refs.head.$el.classList.add('indexFixedBox');//给节点添加吸顶样式
       this.serveimg = this.serve1;
       }else{//滚动小于或大于50px时,回到元素原来的位置
       this.$refs.head.$el.classList.remove('indexFixedBox');//移除节点的吸顶样式
       this.serveimg=this.serve
  }
      }
},
mounted(){//绑定事件
      window.addEventListener('scroll',this.scrollToTop);
  },
  beforeDestroy() {//更改为其它组件的时候要解绑window的事件
    window.removeEventListener("scroll",this.scrollToTop);
  },
}
</script>

加样式使页面高度能有滚动条件

<style>
body{
height:1000px;
}
</style>

vue实现懒加载效果

<template>
 <div class="wrap_main">
        <header>
            <div class="hear_all">
                <i class="hear_cs" @click="goto"></i>
                <div class="search_input">
                    <input type="search" v-model="iput" placeholder="搜索目的地国家/城市/关键词">
                    <img src="../assets/search.png" @click="request(iput)">
                    </div>
                </div>
        </header>
        <section ref="bd">
            <div class="con_main">
                 <el-menu 
                 class="el-menu-demo" 
                 mode="horizontal" >
                <el-submenu 
                v-for="(item,key1) in menus"
                :key="key1" 
                :index="key1">
                <template slot="title" >{{key1}}</template>
                <el-menu-item 
                v-for="(item2,index) in item" 
                :key="index"
                @click="request(item2)"
                style="height:40px;line-height: 40px;"
                :index="item2">{{item2}}</el-menu-item>
                </el-submenu>
                </el-menu>
            </div>
        <div class="infinite-list-wrapper" style="overflow:auto">
         <ul
            @scroll="dataload">
            <li 
            v-for="(item,index) in count"
            :key="index"
            @click="godetail(item.id)"
            >
            <dt>
                <div class="imgBox">
                    <img :src="item.img" >
                    <span>{{item.go}}</span>
                    <var class="mada_span_01">{{item.tab[0]}}</var>
                </div>
            </dt>
            <dd>
                <ul>
                    <li>
                        <strong class="title">{{item.title}}</strong>
                    </li>
                    <li>
                        <strong class="subtitle">{{item.subtitle}}</strong>
                    </li>
                    <li>
                        <p class="tab">
                            <span v-for="item2 in item.tab" :key="item2">{{item2}}</span>
                        </p>
                    </li>
                    <li>
                        <p><span>{{item.date}}</span></p>
                    </li>
                    <li>
                        <div class="price"><p><i></i><strong>{{item.price}}</strong></p></div>
                    </li>
                </ul>
            </dd>
            </li>
        </ul>
            <p v-if="noMore">没有更多了</p>
            <p v-else>加载中...</p>
  </div>
        </section>
    </div>
</template>

获取窗口滚动距离,触发滚动的条件:滚动距离scroolTop + 可视窗口的高度 >= 整个滚动元素(滚动页面)的高度(一般大于可视窗口的高度才会有滚动条)

<script>
export default{
data(){
        return {
            count: '',//请求回的数据,不设置默认值eslint会报错
            datalong:115,//设置初始值(随机的)
            iput:''
        }
    },
    computed: {
      noMore () {//停止加载的条件,数据没有更多了
        return this.count.length >= this.datalong //本地数据内容长度大于或大于数据库请求的总数据
      },
    },
    dataload(){//懒加载请求数据函数
      if(this.count.length <= this.datalong){如果当前的数据(数组形式)长度(即数量)小于请求全部数据长度就执行懒加载
        var scrollTop = window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop;//获取页面滚动距离
         let bd = this.$refs.bd;//绑定整个滚动对象节点
          if(scrollTop+document.documentElement.clientHeight>=bd.offsetHeight){//触发滚动条件
            setTimeout(async function() {//延迟请求数据
         let {data} = await this.$axios.get('http://localhost:4399/searchlist/',{
             params:{num:this.count.length}
         });
           (data).forEach(ele => {//获取数据(一个数组)
               this.count.push(ele);//新获取的数据推进count里面
           })
        }.bind(this), 2000)//更改this指针对象指向vue对象
        }
      }},
}
</script>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值