欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于vue封裝下拉刷新上拉加載組件

 更新時間:2021年09月26日 15:00:13   作者:yang_web  
這篇文章主要為大家詳細介紹了基于vue封裝下拉刷新上拉加載組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

基于vue和原生javascript封裝的下拉刷新上拉加載組件,供大家參考,具體內容如下

  • upTilte插槽是下拉刷新的自定義內容放的地方
  • downTilte插槽是上拉加載的自定義內容放的地方
  • 默認插槽為列表內容區(qū)域

組件代碼如下

<template>
  <div class="refresh" id="refresh">
    <slot name="upTilte"></slot>
    <slot></slot>
    <slot name="downTilte"></slot>
  </div>
</template>

<script>
export default {
  name: 'PullupOrPulldownRefresh',
  props: {
    // 最大移動距離
    maxMove: {
      type: Number,
      default: 300
    },
    // 阻尼系數(shù)
    friction: {
      type: Number,
      default: 0.3
    }
  },
  data() {
    return {
      startY: 0,
      ul: null,
      draw: null,
      up: null,
      down: null,
      y: 0 // 慣性回彈的距離
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.draw = document.getElementById('refresh')
      this.ul = this.draw.children[1]
      this.up = this.draw.children[0]
      this.down = this.draw.children[2]
      this.draw.addEventListener('touchstart', this.touchstart)
      this.draw.addEventListener('touchmove', this.touchmoveEvent)
      this.draw.addEventListener('touchend', this.touchendEvent)
    })
  },
  methods: {
    // 觸摸開始事件
    touchstart(event) {
      this.startY = event.changedTouches[0].clientY
    },
    // 觸摸移動事件
    touchmoveEvent(event) {
      const height = this.ul.clientHeight - this.draw.clientHeight
      if (height === this.draw.scrollTop || this.draw.scrollTop === 0) {
        var a = event.changedTouches[0].clientY - this.startY
        this.y = a <= this.maxMove ? a : this.maxMove
        // 為了清除卡頓問題,需要清除過渡效果
        this.ul.style.transition = 'none'
        this.ul.style.transform = 'translateY(' + this.friction * this.y + 'px)'
        // 修改狀態(tài)
        const upHeight = -this.up.clientHeight + this.friction * this.y
        // 下拉開始
        if (this.friction * this.y > 0) (this.setStatus(this.friction * this.y), this.up.style.transition = 'none', this.up.style.transform = 'translateY(' + upHeight + 'px) translateX(-50%)')
        // 上拉開始
        if (this.friction * this.y < 0) (this.setStatus(this.friction * this.y), this.down.style.transition = 'none', this.down.style.marginTop = this.friction * this.y + 'px')
      }
    },
    // 觸摸結束事件
    touchendEvent(event) {
      if (this.friction * this.y >= 50) this.$emit('RefreshUp', this.friction * this.y)
      else if (this.friction * this.y < -50) this.$emit('RefreshDown', this.friction * this.y)
      else this.resetStyle()
    },
    // 重置并且添加過渡效果
    resetStyle() {
      this.ul.style.transition = 'transform .6s'
      this.ul.style.transform = 'translateY(' + 0 + 'px)'
      this.up.style.transition = 'all .6s'
      this.up.style.transform = 'translateY(-' + this.up.clientHeight + 'px) translateX(-50%)'
      this.down.style.transition = 'all .6s'
      this.down.style.marginTop = -this.down.clientHeight + 'px'
    },
    // 設置刷新狀態(tài)
    setStatus(y) {
      this.$emit('setStatus', y)
    }
  }
}
</script>

<style lang="scss">
.refresh {
  width: 100%;
  height: 100vh;
  border: 2px solid #ccc;
  position: relative;
  overflow: hidden;
  overflow: auto;
  position: fixed;
  ul {
    zoom: 1;
    padding: 0 10%;
  }

  ul::after {
    content: '';
    display: block;
    visibility: hidden;
    height: 0;
    clear: both;
  }

  li {
    list-style: none;
    width: 100%;
    height: 50px;
    line-height: 50px;
    text-align: center;
  }
  .UpRefresh {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    z-index: -9;
  }
  .DownRefresh {
    position: relative;
    left: 50%;
    transform: translateX(-50%);
    margin-top: -10px;
    z-index: -9;
  }
}
</style>
  • 組件的使用方法
  • friction為摩擦系數(shù)
  • @RefreshUp為下拉到一定距離觸發(fā)事件
  • @RefreshDown為上拉到一定距離觸發(fā)事件
  • @setStatus為更改刷新狀態(tài)的方法
<template>
  <div>
    <PullupOrPulldownRefresh
      ref="PullupOrPulldownRefresh"
      :maxMove="maxMove"
      :friction="friction"
      @RefreshUp="RefreshUp"
      @RefreshDown="RefreshDown"
      @setStatus="setStatus"
    >
      <template v-slot:upTilte>
        <!-- <div class="UpRefresh" v-show="isUpRefresh">{{ Uptitle }}</div> -->
        <div class="UpRefresh" v-show="isUpRefresh">
          <img :src="require('@/assets/logo.png')" alt="" />
          <p>{{ Uptitle }}</p>
        </div>
      </template>
      <ul>
        <li
          v-for="(item, index) in data"
          :key="index"
          style="background: orange"
        >
          {{ item }}
        </li>
      </ul>
      <template v-slot:downTilte>
        <div class="DownRefresh" v-show="isDownRefresh">{{ Downtitle }}</div>
      </template>
    </PullupOrPulldownRefresh>
  </div>
</template>

<script>
export default {
  data() {
    return {
      maxMove: 300,
      friction: 0.3,
      data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
      isUpRefresh: false,
      isDownRefresh: false,
      Downtitle: '上拉加載更多',
      Uptitle: '下拉刷新'
    }
  },
  methods: {
    setStatus(y) {
      if (y && y > 0) {
        this.isUpRefresh = true
        this.Uptitle = '下拉刷新'
        if (y >= 50) this.Uptitle = '松手刷新'
        return
      }
      this.isDownRefresh = true
      this.Downtitle = '上拉加載更多'
      if (y <= -50) this.Downtitle = '松手加載更多'
    },
    RefreshUp(y) {
      if (!y) return
      if (y >= 50) {
        this.Uptitle = '正在刷新'
        setTimeout(() => {
          for (var i = 1; i <= 10; i++) {
            this.data.push(this.data[this.data.length - 1] + 1)
          }
          this.$refs.PullupOrPulldownRefresh.resetStyle() // 回彈重置
        }, 1000)
      }
    },
    RefreshDown(y) {
      if (!y) return
      if (y <= -50) {
        this.Downtitle = '正在加載'
        setTimeout(() => {
          for (var i = 1; i <= 10; i++) {
            this.data.push(this.data[this.data.length - 1] + 1)
          }
          this.$refs.PullupOrPulldownRefresh.resetStyle() // 回彈重置
        }, 1000)
      }
    }
  }
}
</script>

<style scoped lang="scss">
.UpRefresh img{
  width: 30px;
}
</style>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • VueJS如何引入css或者less文件的一些坑

    VueJS如何引入css或者less文件的一些坑

    本篇文章主要介紹了VueJS如何引入css或者less文件的一些坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • vue中的get方法\post方法如何實現(xiàn)傳遞數(shù)組參數(shù)

    vue中的get方法\post方法如何實現(xiàn)傳遞數(shù)組參數(shù)

    這篇文章主要介紹了vue中的get方法\post方法如何實現(xiàn)傳遞數(shù)組參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 詳解Vue3 Teleport 的實踐及原理

    詳解Vue3 Teleport 的實踐及原理

    這篇文章主要介紹了Vue3 Teleport 組件的實踐及原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Vue中點擊url下載文件的案例詳解

    Vue中點擊url下載文件的案例詳解

    這篇文章主要介紹了Vue中點擊url下載文件案例詳解,此文需要注意若是文件的url存在跨域的情況,則可能會下載失敗,因為fetch請求連接后,由于跨域,拿不到資源,也就無法執(zhí)行后續(xù)的操作,此時是失敗的,詳細內容跟隨小編一起看看吧
    2022-04-04
  • Vue動態(tài)樣式綁定實例詳解

    Vue動態(tài)樣式綁定實例詳解

    眾所周知vue是操作dom元素的,那么如果有元素要動態(tài)綁定樣式,這種需求,還是要通過改變數(shù)據(jù)來改變視圖的樣式,下面這篇文章主要給大家介紹了關于Vue動態(tài)樣式綁定的相關資料,需要的朋友可以參考下
    2023-04-04
  • vue后臺管理如何配置動態(tài)路由菜單

    vue后臺管理如何配置動態(tài)路由菜單

    這篇文章主要介紹了vue后臺管理如何配置動態(tài)路由菜單,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue實現(xiàn)無限級樹形選擇器

    Vue實現(xiàn)無限級樹形選擇器

    這篇文章主要介紹了Vue實現(xiàn)無限級樹形選擇器,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • 關于移動端與大屏幕自適應適配方案

    關于移動端與大屏幕自適應適配方案

    這篇文章主要介紹了關于移動端與大屏幕自適應適配方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 關于vue中api統(tǒng)一管理的那些事

    關于vue中api統(tǒng)一管理的那些事

    最近在學習Vue教程,下面這篇文章主要給大家介紹了關于vue中api統(tǒng)一管理的那些事,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友可以參考下
    2022-04-04
  • Webpack打包圖片-js-vue 案例解析

    Webpack打包圖片-js-vue 案例解析

    在開發(fā)中我們會有各種各樣的模塊依賴,這些模塊可能來自于自己編寫的代碼,也可能來自第三方庫,本文給大家介紹Webpack打包圖片-js-vue的相關知識,感興趣的朋友跟隨小編一起看看吧
    2023-11-11

最新評論