VUE榜单下拉刷新,上滑刷新

vue榜单里面的下拉刷新和上滑刷新,对应着scroll里面的一个榜单或者同时的两个榜单

直接上代码:

    <template lang="html">

  <div class="yo-scroll"

  :class="{'down':(state===0),'up':(state==1),refresh:(state===2),touch:touching}"

  @touchstart="touchStart($event)"

  @touchmove="touchMove($event)"

  @touchend="touchEnd($event)"

  @scroll="(onInfinite || infiniteLoading) ? onScroll($event) : undefined">

    <section class="inner">

      <header class="pull-refresh">

        <slot name="pull-refresh">

          <span class="down-tip"></span>

          <span class="up-tip"></span>

          <span class="refresh-tip"></span>

        </slot>

      </header>

      <slot></slot>

      <footer class="load-more" >

        <slot name="load-more">

          <span v-show="this.state === 2">加载中……</span>

        </slot>

      </footer>

    </section>

  </div>

</template>

<script>

export default {

  props: {

    offset: {

      type: Number,

      default: 40

    },

    enableInfinite: {

      type: Boolean,

      default: true

    },

    enableRefresh: {

      type: Boolean,

      default: true

    },

    onRefresh: {

      type: Function,

      default: undefined,

      required: false

    },

    onInfinite: {

      type: Function,

      default: undefined,

      require: false

    }

  },

  data() {

    return {

      top: 0,

      state: 0,

      startY: 0,

      touching: false,

      infiniteLoading: false,

    }

  },


  methods: {

    touchStart(e) {

      this.startY = e.targetTouches[0].pageY

      this.startScroll = this.$el.scrollTop || 0

      this.touching = true


    },

    touchMove(e) {

      if (!this.enableRefresh || this.$el.scrollTop > 0 || !this.touching) {

        return

      }

      let diff = e.targetTouches[0].pageY - this.startY - this.startScroll

      if (diff > 0) e.preventDefault()

      this.top = Math.pow(diff, 0.8) + (this.state === 2 ? this.offset : 0)

      if (this.state === 2) { // in refreshing

        return

      }

      if (this.top >= this.offset) {

        this.state = 1

      } else {

        this.state = 0

      }

    },

    touchEnd(e) {

      if (!this.enableRefresh) return

      this.touching = false

      if (this.state === 2) { // in refreshing

        this.state = 2

        this.top = this.offset

        return

      }

      if (this.top >= this.offset) { // do refresh

        this.refresh()

      } else { // cancel refresh

        this.state = 0

        this.top = 0

      }

    },

    refresh() {

      this.state = 2

      this.top = this.offset

      this.onRefresh(this.refreshDone)

    },

    refreshDone() {

      this.state = 0

      this.top = 0

    },

    infinite() {

      this.infiniteLoading = true

      this.onInfinite(this.infiniteDone)

    },

    infiniteDone() {

      this.infiniteLoading = false

    },

    onScroll(e) {

      if (!this.enableInfinite || this.infiniteLoading) {

        return

      }

      let outerHeight = this.$el.clientHeight

      let innerHeight = this.$el.querySelector('.inner').clientHeight

      let scrollTop = this.$el.scrollTop

      let ptrHeight = this.onRefresh ? this.$el.querySelector('.pull-refresh').clientHeight : 0

      let infiniteHeight = this.$el.querySelector('.load-more').clientHeight

      let bottom = innerHeight - outerHeight - scrollTop - ptrHeight

      if (bottom < infiniteHeight) this.infinite()

    }

  }

}

</script>

<style>

.yo-scroll {

  position: absolute;

  height: 11.2rem;

  top: 1.5rem;

  right: 0;

  bottom: 0;

  left: 0;

  overflow-y: scroll;

  -webkit-overflow-scrolling: touch;

}

.yo-scroll .inner {

  position: absolute;

  top: -2rem;

  width: 96%;

  margin: 0 2%;

  transition-duration: 300ms;

  padding-bottom: 2rem;

  /* overflow: scroll; */

}

.yo-scroll .pull-refresh {

  position: relative;

  left: 0;

  top: 0;

  width: 100%;

  height: 2rem;

  display: flex;

  align-items: center;

  justify-content: center;

}

.yo-scroll.touch .inner {

  transition-duration: 0ms;

}

.yo-scroll.down .down-tip {

  display: block;

}

.yo-scroll.up .up-tip {

  display: block;

}

.yo-scroll.refresh .refresh-tip {

  display: block;

}

.yo-scroll .down-tip,

.yo-scroll .refresh-tip,

.yo-scroll .up-tip {

  display: none;

}

.yo-scroll .load-more {

  height: 1rem;

  display: flex;

  align-items: center;

  justify-content: center;

</style>


上面是vue下拉上滑的刷新组件

将其保存到项目里面,在需要使用的组件中去引用。


使用

<v-scroll :on-refresh="onRefresh" :on-infinite="onInfinite" v-if="content.length>0">

</v-scroll>


import Scroll from './loading.vue';

components: {

        "v-scroll": Scroll,

  },

下拉刷新:

// 下拉方法

        onRefresh(done) {

            // this.getList();

            done(); // call done

 },

上滑刷新

onInfinite(done) {

            let vm = this;

            console.log(vm);

let i = vm.pageStart;

                    let end = vm.pageEnd;

                    for (; i < end; i++) {

                        let obj = {};

                        vm.downdata.push(obj);

                        if ((i + 1) >= res.data.length) {

                            this.$el.querySelector('.load-more').style.display = 'none';

                            return;

                        }

                    }

                    done() // call done

切记,一定要在函数中写入done(),否则只会刷新一次,不能做到重复下拉或者上滑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342