vue-better-scroll 的使用


首先安裝better-scroll

npm i better-scroll -S
  • 1

goods頁面模板

<template> <div class="goods"> <div class="menu-wrapper" ref="menuWrapper"> <ul> <li v-for="item in goods" class="menu-item"> <span class="text border-1px"> <span v-show="item.type>0" class="icon" :class="classMap[item.type]"></span>{{item.name}} </span> </li> </ul> </div> <div class="foods-wrapper" ref="foodsWrapper"> <ul> <li v-for="item in goods" > <h1 class="title">{{item.name}}</h1> <ul> <li v-for="food in item.foods" class="food-item border-1px"> <div class="icon"> <img :src="food.icon" alt="" width="57" height="57"> </div> <div class="content"> <h2 class="name">{{food.name}}</h2> <p class="desc">{{food.description}}</p> <div class="extra"> <span class="food-number">月售{{food.sellCount}}</span> <span>好評率{{food.rating}}%</span> </div> <div class="price"> <span class="nowPrice">¥{{food.price}}</span> <span class="oldPrice">¥{{food.oldPrice}}</span> </div> </div> </li> </ul> </li> </ul> </div> </div> </template>

 

js

<script type="text/ecmascript-6"> /* eslint-disable*/  import BScroll from 'better-scroll' export default{ props:{ seller:{ type:Object } }, data(){ return{ goods:[] } }, created(){ this.classMap=['decrease', 'discount', 'special', 'invoice', 'guarantee'] this.$http.get('/api/goods').then((res)=>{ this.goods=res.data.data; this.$nextTick(()=>{ this._initScroll(); }) console.log(this.$refs.menuWrapper) }) }, methods:{ _initScroll(){ this.meunScroll=new BScroll(this.$refs.menuWrapper,{}); this.foodsScroll=new BScroll(this.$refs.foodsWrapper,{}); } } } </script>

先用ref 綁定事件, 在vue中 用$ .refs注冊
在鈎子函數 create中 用vue-resource 請求數據,並異步調用方法
this.$nextTick(()=>{ this._initScroll(); }

   注冊方法

    

_initScroll(){ this.meunScroll=new BScroll(this.$refs.menuWrapper,{}); this.foodsScroll=new BScroll(this.$refs.foodsWrapper,{}); }

better-scroll用法

我們先來看一下 better-scroll 常見的 html 結構:

<div class="wrapper"> <ul class="content"> <li></li> <li></li> <li></li> <li></li> </ul> </div> 

 

當 content 的高度不超過父容器的高度,是不能滾動的,而它一旦超過了父容器的高度,我們就可以滾動內容區了,這就是 better-scroll 的滾動原理。

 import BScroll from 'better-scroll' let wrapper = document.querySelector('.wrapper') let scroll = new BScroll(wrapper, {})

better-scroll 對外暴露了一個 BScroll 的類,我們初始化只需要 new 一個類的實例即可。第一個參數就是我們 wrapper 的 DOM 對象,第二個是一些配置參數。 
better-scroll 的初始化時機很重要,因為它在初始化的時候,會計算父元素和子元素的高度和寬度,來決定是否可以縱向和橫向滾動。因此,我們在初始化它的時候,必須確保父元素和子元素的內容已經正確渲染了。如果沒有辦法滑動,那就是初始化的時機不對。 
餓了么是這樣處理的:

mounted() {
   this.$nextTick(() => { this.scroll = new Bscroll(this.$refs.wrapper, {}) }) }

 

this.$nextTick()這個方法作用是當數據被修改后使用這個方法會回調獲取更新后的dom再render出來 
如果不在下面的this.$nextTick()方法里回調這個方法,數據改變后再來計算滾動軸就會出錯

上拉刷新功能

 1 <div class="wrapper" ref="wrapper">
 2         <ul class="content" ref="content">
 3           <li v-for="(item,key) in detail" :key="key" v-if="detail.length > 0">
 4             <Row type="flex" justify="start" align="middle">
 5               <Col :span="8" class="detail-item">
 6               <span :class="{'color-red':item.is_delay === 1}">{{item.order_sn}}</span>
 7               </Col>
 8               <Col :span="8" class="detail-item">
 9               <span>{{item.date}}</span>
10               </Col>
11               <Col :span="8" class="detail-item">
12               <span>¥ {{item.partner_profit  | number2}}</span>
13               </Col>
14             </Row>
15           </li>
16           <li v-if="!scrollFinish">
17             <Row type="flex" justify="center" align="middle">
18               <Col :span="6" v-if="loadingText">
19               <p>{{loadingText}}</p>
20               </Col>
21               <Col :span="2" v-else>
22                 <Spin size="large"></Spin>
23               </Col>
24             </Row>
25           </li>
26         </ul>
27       </div>

 

 1 mounted() {
 2       // 設置wrapper的高度
 3       this.$refs.wrapper.style.height = document.getElementById("app").offsetHeight - document.getElementById("scroll").offsetTop + "px";
 4       // better-scroll 的content高度不大於wrapper高度就不能滾動,這里的問題是,當一頁數據的高度不夠srapper的高度的時候,即使存在n頁也不能下拉
 5       // 需要設置content的min-height大於wrapper高度
 6       this.$refs.content.style.minHeight = this.$refs.wrapper.offsetHeight + 1 + "px";
 7       this._initScroll();
 8       this.getIncomeDetail(this.nextPage);
 9       // 設置scroll的高度
10       // this.scrollHeight = document.getElementById("app").offsetHeight - document.getElementById("scroll").offsetTop ;
11     },

 

methods:{
    _initScroll() {
        this.orderScroll = new BScroll(this.$refs.wrapper, {
          probeType: 3,    
          click:true,
          pullUpLoad: {   // 配置上啦加載
            threshold: -80   //上拉80px的時候加載
          },
          mouseWheel: {    // pc端同樣能滑動
            speed: 20,
            invert: false
          },
          useTransition:false,  // 防止iphone微信滑動卡頓
        });
        // 上拉加載數據
        this.orderScroll.on('pullingUp',()=>{
          this.scrollFinish = false;
          // 防止一次上拉觸發兩次事件,不要在ajax的請求數據完成事件中調用下面的finish方法,否則有可能一次上拉觸發兩次上拉事件
          this.orderScroll.finishPullUp();
          // 加載數據
          this.getIncomeDetail(this.nextPage);
        });
      }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM