vue-better-scroll 的使用实例代码详解


Posted in Javascript onDecember 03, 2018

首先安装better-scroll

npm i better-scroll -S

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()方法里回调这个方法,数据改变后再来计算滚动轴就会出错

上拉刷新功能

<div class="wrapper" ref="wrapper">
    <ul class="content" ref="content">
     <li v-for="(item,key) in detail" :key="key" v-if="detail.length > 0">
      <Row type="flex" justify="start" align="middle">
       <Col :span="8" class="detail-item">
       <span :class="{'color-red':item.is_delay === 1}">{{item.order_sn}}</span>
       </Col>
       <Col :span="8" class="detail-item">
       <span>{{item.date}}</span>
       </Col>
       <Col :span="8" class="detail-item">
       <span>¥ {{item.partner_profit | number2}}</span>
       </Col>
      </Row>
     </li>
     <li v-if="!scrollFinish">
      <Row type="flex" justify="center" align="middle">
       <Col :span="6" v-if="loadingText">
       <p>{{loadingText}}</p>
       </Col>
       <Col :span="2" v-else>
        <Spin size="large"></Spin>
       </Col>
      </Row>
     </li>
    </ul>
   </div>

   mounted() {
   // 设置wrapper的高度
   this.$refs.wrapper.style.height = document.getElementById("app").offsetHeight - document.getElementById("scroll").offsetTop + "px";
   // better-scroll 的content高度不大于wrapper高度就不能滚动,这里的问题是,当一页数据的高度不够srapper的高度的时候,即使存在n页也不能下拉
   // 需要设置content的min-height大于wrapper高度
   this.$refs.content.style.minHeight = this.$refs.wrapper.offsetHeight + 1 + "px";
   this._initScroll();
   this.getIncomeDetail(this.nextPage);
   // 设置scroll的高度
   // this.scrollHeight = document.getElementById("app").offsetHeight - document.getElementById("scroll").offsetTop ;
  },

  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);
    });
   }

总结

以上所述是小编给大家介绍的vue-better-scroll 的使用实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery 自定义CircleAnimation,Animate方法学习笔记
Jul 10 Javascript
JavaScript模板入门介绍
Sep 26 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
Apr 02 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
使用Raygun对Node.js应用进行错误处理的方法
Jun 23 Javascript
javascript控制台详解
Jun 25 Javascript
JS实现弹出居中的模式窗口示例
Jun 20 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
Mar 06 Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
Jun 07 Javascript
vue-i18n实现中英文切换的方法
Jul 06 Javascript
layui使用及简单的三级联动实现教程
Dec 01 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
Dec 03 #Javascript
Vue.js 图标选择组件实践详解
Dec 03 #Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
Dec 03 #Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
Dec 03 #Javascript
利用jquery和BootStrap实现动态滚动条效果
Dec 03 #jQuery
微信小程序实现页面下拉刷新和上拉加载功能详解
Dec 03 #Javascript
微信小程序在地图选择地址并返回经纬度简单示例
Dec 03 #Javascript
You might like
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
10个php函数实用却不常见
2015/10/13 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
js数组去重的方法总结
2019/01/18 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
Python 的类、继承和多态详解
2017/07/16 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
信息合作协议书
2014/10/09 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
2014年政协工作总结
2014/12/09 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
MySQL学习之基础命令实操总结
2022/03/19 MySQL