令better-scroll更完美的封装(一)

better-scroll的功能挺强大的,虽然一开始的时候有很多bug,被戏称bug-scroll,但是该项目一直都在更新,变得越来越好。

为了防止意外,我们还是要对better-scroll封装一下,并让better-scroll更好用。

1.我个人认为滚动的内容往往都需要一个置顶按钮,所以我们在封装better-scroll时顺便给它添加一键置顶功能

2.将常用的功能函数封装起来,让我们调用组件时更高效。

首先封装一个一键置顶的组件(图片选自己喜欢的即可)

<template>
  <div class="back-top">
    <img src="~assets/common/top.png" alt="" />
  </div>
</template>
<script>
export default {
  name: "BackTop",
};
</script>
<style scoped>
.back-top {
  position: fixed;
  right: 10px;
  bottom: 60px;
}

.back-top img {
  height: 43px;
  width: 43px;
}
</style>

然后开始对better-scroll封装

<template>
  <div ref="wrapper">
    <div>
      <slot></slot>
    </div>
    <back-top
      @click.native="returnTop(backTopTime)"
      v-show="isShowBT"
    ></back-top>
  </div>
</template>

<script>
import PullUp from "@better-scroll/pull-up";
import BSscroll from "better-scroll";
import BackTop from "components/common/backtop/BackTop";

BSscroll.use(PullUp);
export default {
  name: "Scroll",
  data() {
    return {
      scroll: null,
      isShowBT: false, //用来确定置顶按钮是否出现
    };
  },
  components: {
    BackTop,
  },
  props: {
    probeType: {
      type: Number,
      default: 0,
    //0和1为不监听滚动,2为只监听手指滑动的滚动,不监听惯性滚动,3为既监听手指滑动滚动,也监听惯性滚动
    },
    click: {
      type: Boolean,
      default: true,
    //点击事件默认可运行
    },
    pullUpLoad: {
      type: Boolean,
      default: false,
      // pullUpLoad需要默认设置为false,因为新版本这个设为true后默认probetype就是3了,这样所有组件监听时刻打开
    },
    backTopTime: {
      type: Number,
      default: 400,
      // 返回顶部的时间,默认为400ms
    },
  },
  mounted() {
    //   1.创建对象
    this.scroll = new BSscroll(this.$refs.wrapper, {
      probeType: this.probeType,
      click: this.click,
      pullUpLoad: this.pullUpLoad,
      observeDOM: true,
      // 新版本如果遇到滚不动的情况,要把observeDOM设为ture
    });
    // 2.监听滚动位置
    this.scroll.on("scroll", (position) => {
      // console.log(position);
      this.$emit("scroll", position);
      this.isShowBT = position.y < -1000;
    //一般滑动1000px一键置顶按钮就该出来了,这个数值可以根据个人喜好设定,其实这个数值还可以再封装,但我觉得没必要,就直接写死了
    });
    // 3.监听上拉事件
    this.scroll.on("pullingUp", () => {
      this.$emit("pullingUp");
    });
  },
  methods: {
    //   调整到对应坐标的方法
    scrollTo(x, y, time = 400) {
      this.scroll.scrollTo(x, y, time);
    },
    //完成下拉动作
    finishPullUp() {
      this.scroll.finishPullUp();
    },
    // 直接置顶
    returnTop(t) {
      this.scroll.scrollTo(0, 0, t);
    },
    //刷新content高度
    refresh() {
      this.scroll && this.scroll.refresh();
    },
  },
};
</script>
<style scoped>
</style>

对于每一个常用功能和方法都在备注上标明了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值