一、better-scroll的初始使用
首先下載
cnpm install better-scroll
在代碼中引用
import BScroll from ‘better-scroll’
接下來便是new
let wrapper = document.querySelector('.wrapper')
let scroll = new BScroll(wrapper)//wrapper是外層較小的那個盒子
⚠️:使用原理必須是外層有一個較小的盒子,外層有一個較大的盒子,這樣才可以滾動起來。
同時new BScroll的時候需要獲取真實的DOM元素,所以需要在mounted生命周期內進行。
二、特點
會使tap事件失效
解決方案,在new的時候,設置click,tap為true
1 mounted(){ 2 this.scroll = new BScroll(this.$refs.wrapper,{ 3 tap:true, 4 click:true 5 }) 6 },
三、
在better-scroll的封裝文件中(vue)
1 <template> 2 <div class="wrapper" ref="wrapper"> 3 <slot></slot> 4 </div> 5 </template> 6 7 <script> 8 import BScroll from "better-scroll" 9 export default { 10 name:"alley-BScroll", 11 mounted(){ 12 this.scroll = new BScroll(this.$refs.wrapper,{ 13 tap:true, 14 pullDownRefresh:true,//這個配置用於做下拉刷新功能,默認為 false。當設置為 true 或者是一個 Object 的時候,可以開啟下拉刷新 15 pullUpLoad:true//這個配置用於做上拉加載功能,默認為 false。當設置為 true 或者是一個 Object 的時候,可以開啟上拉加載 16 }) 17 }, 18 methods:{ 19 //下拉刷新加載數據 20 handlepullingDown(callback){ 21 this.scroll.on("pullingDown",()=>{ 22 callback(); 23 }) 24 }, 25 //下拉刷新加載數據完畢通知better-scroll 26 handlefinishPullDown(){ 27 this.scroll.finishPullDown();//通知bettwer-scroll已經加載完畢 28 this.scroll.refresh();//重新計算 better-scroll,當 DOM 結構發生變化的時候務必要調用確保滾動的效果正常。 29 }, 30 //上拉加載更多 31 handlepullingUp(callback){ 32 this.scroll.on("pullingUp",()=>{ 33 callback() 34 }) 35 }, 36 handlefinishPullUp(){ 37 this.scroll.finishPullUp(); 38 this.scroll.refresh(); 39 } 40 } 41 } 42 </script> 43 44 45 <style> 46 .wrapper{ 47 height: 100%; 48 } 49 </style>
在要使用該使用該封裝的組件,只需要用這個組件將要出現效果的元素包裹起來即可,如下所示,包起來后,內容便可以有彈性的滑動了。
1 <alley-BScroll ref="alleyscroll"> 2 <div class="movie_body"> 3 <div 4 class="movie_item" 5 v-for="(item,index) in movieList" 6 :key="index" 7 @click="handleclick()" 8 > 9 <div class="movie_item_pic"> 10 <img :src="item.img |ToImg('128.180')" /> 11 </div> 12 <div class="movie_item_info"> 13 <h2>{{item.nm}}</h2> 14 <p> 15 觀眾評: 16 <span class="grade">{{item.sc}}</span> 17 </p> 18 <p> 19 主演: 20 <span>{{item.star}}</span> 21 </p> 22 <p> 23 <span>{{item.showInfo}}</span> 24 </p> 25 </div> 26 <div 27 :class="item.globalReleased?'movie_item_btn asale':'movie_item_btn ticket'" 28 >{{item.globalReleased?'購票':'預售'}}</div> 29 </div> 30 </div> 31 </alley-BScroll>
接下來便可以調用封裝組件里的方法了,因為需要獲取DOM元素,便要寫在mounted這個生命周期內。
1 mounted(){ 2 //下拉刷新 3 this.$refs.alleyscroll.handlepullingDown(async ()=>{ 4 5 let n = parseInt(Math.random()*7); 6 let arr = [10,1,20,40,50,55,59] 7 8 9 10 let data = await movie_now_api(arr[n]); 11 this.movieList = data.data.movieList; 12 sessionStorage.setItem("movieList",JSON.stringify(data.data.movieList)) 13 this.$refs.alleyscroll.handlefinishPullDown();//下拉刷新完成后,通知better-scroll,下拉刷新已經完成。 14 }) 15 16 17 //上拉加載更多 18 this.$refs.alleyscroll.handlepullingUp(async ()=>{ 19 let n = parseInt(Math.random()*7); 20 let arr = [10,1,20,40,50,55,59] 21 let data = await movie_now_api(arr[n]); 22 this.movieList = [...this.movieList,...data.data.movieList]; 23 sessionStorage.setItem("movieList",JSON.stringify(data.data.movieList)) 24 this.$refs.alleyscroll.handlefinishPullUp(); 25 }) 26 }