better-scroll遇見vue

  • 介紹better-scroll

better-scroll 最常見的應(yīng)用場(chǎng)景是列表滾動(dòng)首繁,我們來看一下它的 html 結(jié)構(gòu)

<div class="wrapper">
  <ul class="content">
    <li>...</li>
    <li>...</li>
    ...
  </ul>
  <!-- 這里可以放一些其它的 DOM,但不會(huì)影響滾動(dòng) -->
</div>

上面的代碼中 better-scroll 是作用在外層 wrapper 容器上的,滾動(dòng)的部分是 content 元素。這里要注意的是甚颂,better-scroll 只處理容器(wrapper)的第一個(gè)子元素(content)的滾動(dòng)刁品,其它的元素都會(huì)被忽略。

最簡(jiǎn)單的初始化代碼如下:

import BScroll from 'better-scroll'
let wrapper = document.querySelector('.wrapper')
let scroll = new BScroll(wrapper)
  • better-scroll在vue中的使用

安裝 npm install better-scroll --save

<template>
  <div class="wrapper" ref="wrapper">
    <ul class="content">
      <li>...</li>
      <li>...</li>
      ...
    </ul>
  </div>
</template>
<script>
  import BScroll from 'better-scroll'
  export default {
    mounted() {
      this.$nextTick(() => {
        this.scroll = new BScroll(this.$refs.wrapper, {})
      })
    }
  }
</script>

Vue.js 提供了我們一個(gè)獲取 DOM 對(duì)象的接口—— vm.$refs勋桶。在這里,我們通過了 this.$refs.wrapper訪問到了這個(gè) DOM 對(duì)象侥猬,并且我們?cè)?mounted 這個(gè)鉤子函數(shù)里例驹,this.$nextTick 的回調(diào)函數(shù)中初始化 better-scroll 。因?yàn)檫@個(gè)時(shí)候退唠,wrapper 的 DOM 已經(jīng)渲染了鹃锈,我們可以正確計(jì)算它以及它內(nèi)層 content 的高度,以確保滾動(dòng)正常瞧预。

這里的 this.$nextTick 是一個(gè)異步函數(shù)屎债,為了確保 DOM 已經(jīng)渲染,感興趣的同學(xué)可以了解一下它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)垢油,底層用到了 MutationObserver 或者是 setTimeout(fn, 0)盆驹。其實(shí)我們?cè)谶@里把 this.$nextTick 替換成 setTimeout(fn, 20) 也是可以的(20 ms 是一個(gè)經(jīng)驗(yàn)值,每一個(gè) Tick 約為 17 ms)滩愁,對(duì)用戶體驗(yàn)而言都是無感知的躯喇。

  • better-scroll的事件
<template>
  <div class="wrapper" ref="wrapper">
    <ul class="content">
      <li v-for="item in data">{{item}}</li>
    </ul>
    <div class="loading-wrapper"></div>
  </div>
</template>
<script>
  import BScroll from 'better-scroll'
  export default {
    data() {
      return {
        data: []
      }
    },
    created() {
      this.loadData()
    },
    methods: {
      loadData() {
        requestData().then((res) => {
          this.data = res.data.concat(this.data)
          this.$nextTick(() => {
            if (!this.scroll) {
              this.scroll = new BScroll(this.$refs.wrapper, {})
              this.scroll.on('touchend', (pos) => {
                // 下拉動(dòng)作
                if (pos.y > 50) {
                  this.loadData()
                }
              })
            } else {
              this.scroll.refresh()
            }
          })
        })
      }
    }
  }
</script>

這段代碼比之前稍微復(fù)雜一些, 當(dāng)我們?cè)诨瑒?dòng)列表松開手指時(shí)候, better-scroll 會(huì)對(duì)外派發(fā)一個(gè) touchend 事件硝枉,我們監(jiān)聽了這個(gè)事件廉丽,并且判斷了 pos.y > 50(我們把這個(gè)行為定義成一次下拉的動(dòng)作)。如果是下拉的話我們會(huì)重新請(qǐng)求數(shù)據(jù)妻味,并且把新的數(shù)據(jù)和之前的 data 做一次 concat正压,也就更新了列表的數(shù)據(jù),那么數(shù)據(jù)的改變就會(huì)映射到 DOM 的變化责球。需要注意的一點(diǎn)焦履,這里我們對(duì) this.scroll 做了判斷,如果沒有初始化過我們會(huì)通過 new BScroll 初始化棕诵,并且綁定一些事件裁良,否則我們會(huì)調(diào)用 this.scroll.refresh 方法重新計(jì)算,來確保滾動(dòng)效果的正常校套。

官網(wǎng)https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll%20%E6%98%AF%E4%BB%80%E4%B9%88
參考https://zhuanlan.zhihu.com/p/27407024

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末价脾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笛匙,更是在濱河造成了極大的恐慌侨把,老刑警劉巖犀变,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秋柄,居然都是意外死亡获枝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門骇笔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來省店,“玉大人,你說我怎么就攤上這事笨触∨嘲” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵芦劣,是天一觀的道長(zhǎng)粗俱。 經(jīng)常有香客問我,道長(zhǎng)虚吟,這世上最難降的妖魔是什么寸认? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮串慰,結(jié)果婚禮上偏塞,老公的妹妹穿的比我還像新娘。我一直安慰自己邦鲫,他們只是感情好烛愧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掂碱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慎冤。 梳的紋絲不亂的頭發(fā)上疼燥,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蚁堤,去河邊找鬼醉者。 笑死,一個(gè)胖子當(dāng)著我的面吹牛披诗,可吹牛的內(nèi)容都是我干的撬即。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼呈队,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼剥槐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宪摧,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤粒竖,失蹤者是張志新(化名)和其女友劉穎颅崩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊苗,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沿后,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朽砰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尖滚。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞧柔,靈堂內(nèi)的尸體忽然破棺而出漆弄,到底是詐尸還是另有隱情,我是刑警寧澤非剃,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布置逻,位于F島的核電站,受9級(jí)特大地震影響备绽,放射性物質(zhì)發(fā)生泄漏券坞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一肺素、第九天 我趴在偏房一處隱蔽的房頂上張望恨锚。 院中可真熱鬧,春花似錦倍靡、人聲如沸猴伶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽他挎。三九已至,卻和暖如春捡需,著一層夾襖步出監(jiān)牢的瞬間办桨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國打工站辉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呢撞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓饰剥,卻偏偏與公主長(zhǎng)得像殊霞,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汰蓉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容