vue_music:封装scroll.vue组件

简介: 在项目中经常用到滚动,结合Better-scroll封装了sroll.vue组件参考链接:https://ustbhuangyi.github.io...http://www.imooc.com/article/...**better-scroll 只处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略**。

在项目中经常用到滚动,结合Better-scroll封装了sroll.vue组件
参考链接:https://ustbhuangyi.github.io...
http://www.imooc.com/article/...
**better-scroll 只处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略**。

1.html部分

这个很简单,有一个插槽slot
**better-scroll 只处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略。**


<template>
    <div ref="wrapper">
        <slot></slot>
    </div>
</template>

2.功能

  1. 滚动特性props:是否截流滚动、是否派发事件、是否有数据传入
  2. 初始化Better-scroll

export default {
  props: {
    probeType: {
       //有时候我们需要知道滚动的位置。
       //当 probeType 为 1 的时候,会非实时(屏幕滑动超过一定时间后:截流)派发scroll 事件;
       //当 probeType 为 2 的时候,会在屏幕滑动的过程中实时(不截流)的派发 scroll 事件;
       //当 probeType 为 3 的时候,不仅在屏幕滑动的过程中,而且在 momentum(回弹) 滚动动画运行过程中实时派发 scroll 事件。
       //如果没有设置该值,其默认值为 0,即不派发 scroll 事件
      type: Number,
      default: 1
    },
    click: {
      //click是否派发click事件,通常判断浏览器派发的click还是betterscroll派发的click,
      //可以用event._constructed判断,为true,则是betterscroll派发的
      type: Boolean,
      defalut: true
    },
    data: {
      //滚动的界面是否有了数据(这些数据多数是异步获取的)
      //根据这个当有数据的时候refresh,在watch中有相关逻辑
      type: Array,
      default: null
    },
    listenScroll: {
      //是否派发滚动位置
      type: Boolean,
      default: false
    },
    //实现上拉刷新
    pullup: {
        type: Boolean,
        default: false
    },
    //实现下拉刷新
    pulldown: {
      type: Boolean,
      default: false
    },
    //开始滚动的时候派发一个事件
    beforeScroll: {
        type: Boolean,
        default: false
    }
  },
  data() {
    return {

    }
  },
  mounted() {
    setTimeout(() => {
      this._initScroll()  //初始化
    }, 20)
  },
  methods: {
    _initScroll() {
      if (!this.$refs.wrapper) {
        return
      }
      this.scroll = new BScroll(this.$refs.wrapper, {
        probeType: this.probeType,
        click: this.click
      })
      //派发滚动位置
      if (this.listenScroll) {
        let me = this
        this.scroll.on('scroll', (pos) => {
          //pos.y
          //往上滑动负数,往下滑动正数
          me.$emit('scroll', pos)
        })
      }
      //上拉刷新,滚动到底部派发一个事件
      if (this.pullup) {
          this.scroll.on('scrollEnd', () => {
              if(this.scroll.y <= (this.scroll.maxScrollY + 50)) {
                  this.$emit('scrllToEnd')
              }
          })
      }
      //是否派发顶部下拉事件,用于下拉刷新
      if (this.pulldown) {
        this.scroll.on('touchend', (pos) => {
          //下拉动作
          if (pos.y > 50) {
            this.$emit('pulldown')
          }
        })
      }
      //开始滚动的时候派发一个事件
      //比如,搜索下拉框,滚动下拉框的时候,派发开始滚动事件,从而收起键盘
      if (this.beforeScroll) {
          this.scroll.on('beforeScrollStart', () => {
              this.$emit('beforeScroll')
          })
      }
    },
    enable() {
      this.scroll && this.scroll.enable()
    },
    disable() {
      this.scroll && this.scroll.disable()
    },
    refresh() {
      this.scroll && this.scroll.refresh()
    },
    scrollTo() {
      this.scroll && this.scroll.scrollTo.apply(this.scroll, arguments)
    },
    scrollToElement() {
      this.scroll && this.scroll.scrollToElement.apply(this.scroll, arguments)
    }
  },
  watch: {
    data() {
      setTimeout(() => {
        this.refresh()
      }, 20)
    }
  }
}

3.使用

在recommend.vue中使用

在这里插入图片描述

注:样式


//控制高度才能滚动
.recommend {
    position: fixed;
    width: 100%;
    top: 88px;
    bottom: 0;
}
.recommend-content {
    height: 100%;
    overflow: hidden;
}

原文地址:https://segmentfault.com/a/1190000016979411

相关文章
|
5天前
|
JavaScript API
vue 批量自动引入并注册组件或路由等等
【10月更文挑战第12天】 vue 批量自动引入并注册组件或路由等等
|
5天前
|
JavaScript 前端开发 API
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
93 0
|
6天前
|
JavaScript
vue 组件中的 data 为什么是一个函数 ?
【10月更文挑战第8天】 在 Vue 组件中,`data` 被定义为一个函数而非普通对象,以确保每个组件实例拥有独立的数据空间,避免数据混乱。这种方式还支持数据的响应式更新、组件的继承与扩展,并有助于避免潜在问题,提升应用的可靠性和性能。
13 2
|
6天前
|
JavaScript 前端开发 UED
Vue 组件设计:构建生动多彩的树形结构组件
本文介绍了如何使用 Vue 构建一个功能强大的树形结构组件。该组件支持递归渲染节点及其子节点,提供了自定义节点颜色、文本和布局的功能。通过独特的样式处理不同层级的节点,展示出丰富的视觉效果。组件还支持动态布局和缩放,确保灵活的界面展示和用户体验。文章提供了详细的代码实现,包括 HTML、JavaScript 和 SCSS,帮助开发者快速集成和定制自己的树形结构组件。
30 0
Vue 组件设计:构建生动多彩的树形结构组件
|
7天前
|
JavaScript 搜索推荐
Vue 插槽全攻略:重塑组件灵活性
【10月更文挑战第7天】 Vue 的插槽(Slots)是一个强大的特性,用于增强组件的灵活性和可扩展性。插槽允许父组件向子组件传递内容,实现组件的复用和个性化展示。主要包括默认插槽、具名插槽和作用域插槽三种类型,分别适用于不同场景。通过插槽,可以提高组件的复用性、实现灵活的布局,并促进团队协作。
16 1
|
8天前
|
JavaScript
vue 函数化组件
【10月更文挑战第1天】 Vue.js 的函数化组件通过设置 `functional: true`,使其无状态和无实例,从而减少渲染开销。通过 `render` 函数的 `context` 参数传递数据。示例中,`smart-item` 组件根据 `data.type` 动态选择并渲染 `ImgItem`、`VideoItem` 或 `TextItem` 组件。根实例 `app` 通过按钮切换不同类型的组件数据。函数化组件适用于程序化选择组件和操作传递数据的场景。
|
12天前
|
前端开发 JavaScript API
Vue3商品SKU多规格编辑组件
Vue3商品SKU多规格编辑组件
34 5
|
9天前
|
JavaScript 前端开发
VUE学习三:双向绑定指令(v-mode)、组件化开发(全局组件/局部组卷/组件通信)、组件化高级(slot插槽使用)
这篇文章是关于Vue.js框架中的v-model指令和组件化开发的详细教程,涵盖了从基础使用到高级功能的多个方面。
19 1
|
9天前
|
JavaScript 程序员 开发者
你真的完全了解vue组件的概念吗?
【10月更文挑战第7天】你真的完全了解vue组件的概念吗?
|
11天前
|
缓存 JavaScript UED
vue的动态组件 keep-alive
【10月更文挑战第6天】
27 3