Vue Better Scroll 无法滚动问题

Better Scroll 官网: better-scroll.github.io/docs/en-US/

Better Scroll 静态数据超出屏幕后可以滚动, 但是如果开始内容没有超出容器, 后面数据更新并内容超出容器, 发现滚动无效.

Vue文件 代码如下:
xml 复制代码
<template>
<div>
  <div class="horizontal-container">
      <div class="scroll-wrapper" ref="scroll">
        <div class="scroll-content">
          <div class="scroll-item" v-for="(item, index) in emojis" :key="index">{{item}}</div>  
        </div>
      </div>
    </div>
</div>
</template>

<script>
import BScroll from '@better-scroll/core' 
export default {
  name: '',
  data () {
    return {
      emojis: ['👉🏼 😁 😂 🤣 👈🏼'],
      emojis2: [
        '👉🏼 😁 😂 🤣 👈🏼',
        '😄 😅 😆 😉 😊',
        '😫 😴 😌 😛 😜',
        '👆🏻 😒 😓 😔 👇🏻',
        '😑 😶 🙄 😏 😣',
        '😞 😟 😤 😢 😭',
        '🤑 😲 ☹️ 🙁 😖',
        '👍 👎 👊 ✊ 🤛',
        '☝️ ✋ 🤚 🖐 🖖',
        '👍🏼 👎🏼 👊🏼 ✊🏼 🤛🏼',
        '☝🏽 ✋🏽 🤚🏽 🖐🏽 🖖🏽',
        '🌖 🌗 🌘 🌑 🌒'
      ]
    }
  },
  mounted () {
    this.init()
    setTimeout(() => {
      console.log('2s: ') 
      this.emojis = this.emojis2  // 注意这里
    }, 2000) 
  },
  beforeDestroy () {
    this.bs.destroy()
  },
  methods: {
    init () {
      this.bs = new BScroll(this.$refs.scroll, {
        scrollX: true,
        probeType: 3 // listening scroll hook
      })
      this._registerHooks(['scroll', 'scrollEnd'], (pos) => {
        console.log('done')
      })
    },
    _registerHooks (hookNames, handler) {
      hookNames.forEach((name) => {
        this.bs.on(name, handler)
      })
    }
  }
}
</script>

<style>
.horizontal-container .scroll-wrapper {
  width: 90%;
  margin: 80px auto;
  white-space: nowrap;
  border: 3px solid #42b983;
  border-radius: 5px;
  overflow: hidden;
}

.scroll-content {
  display: inline-block !important;
}

.scroll-item {
  height: 50px;
  line-height: 50px;
  font-size: 24px;
  display: inline-block;
  text-align: center;
  padding: 0 10px;
}

</style>

根据业务需求, 数据是动态更新的, 这里直接根据官方的静态例子进行修改调整, 发现动态添加数据当内容超过容器后滚动条无效, 即使执行 this.bs.refresh() 函数也无效.

看了官方的常见问题以及网上的一些文章依然没能解决 大写的尴尬 😂😂😂

由于业务功能中滚动区域内容不多, 尝试换了一种思路, 既然无法正确触发 Better Scroll 的计算相关函数或者代码, 绑定数据后再初始化 Better Scroll 这个应该就没问题了, 先试一下, 然后 <script> 中的代码变成了如下样子

xml 复制代码
<script>
import BScroll from '@better-scroll/core' 
export default {
  name: '',
  data () {
    return {
      emojis: ['👉🏼 😁 😂 🤣 👈🏼'],
      emojis2: [
        '👉🏼 😁 😂 🤣 👈🏼',
        '😄 😅 😆 😉 😊',
        '😫 😴 😌 😛 😜',
        '👆🏻 😒 😓 😔 👇🏻',
        '😑 😶 🙄 😏 😣',
        '😞 😟 😤 😢 😭',
        '🤑 😲 ☹️ 🙁 😖',
        '👍 👎 👊 ✊ 🤛',
        '☝️ ✋ 🤚 🖐 🖖',
        '👍🏼 👎🏼 👊🏼 ✊🏼 🤛🏼',
        '☝🏽 ✋🏽 🤚🏽 🖐🏽 🖖🏽',
        '🌖 🌗 🌘 🌑 🌒'
      ]
    }
  },
  mounted () {
    setTimeout(() => {
      console.log('2s: ')
      this.emojis = this.emojis2
      this.$nextTick(() => {
        this.init()
      })
    }, 2000)
  },
  beforeDestroy () {
    this.bs.destroy()
  },
  methods: {
    init () {
      this.bs = new BScroll(this.$refs.scroll, {
        scrollX: true,
        probeType: 3 // listening scroll hook
      })
      this._registerHooks(['scroll', 'scrollEnd'], (pos) => {
        console.log('done')
      })
    },
    _registerHooks (hookNames, handler) {
      hookNames.forEach((name) => {
        this.bs.on(name, handler)
      })
    }
  }
}
</script>

果然好使了, 但是有个问题, 这样每次更新数据都会重新初始化 Better Scroll , 这样有不必要的性能开销. 目前还无解.

做个记录, 解决后再次更新

继续解决遗留问题, 在清理代码时, 发现把 this.nextTick() 去掉后又不能滚动了, 这里又有一个想法, 会不会之前的数据更新后, 调用 this.bs.refresh() 时没有用 nextTick() 函数包裹导致无法更新 Better Scroll 的中的函数代码的, 试一下, <script> 中的代码再次调整

kotlin 复制代码
<script>
import BScroll from '@better-scroll/core' 
export default {
  name: '',
  data () {
    return {
      emojis: ['👉🏼 😁 😂 🤣 👈🏼'],
      emojis2: [
        '👉🏼 😁 😂 🤣 👈🏼',
        '😄 😅 😆 😉 😊',
        '😫 😴 😌 😛 😜',
        '👆🏻 😒 😓 😔 👇🏻',
        '😑 😶 🙄 😏 😣',
        '😞 😟 😤 😢 😭',
        '🤑 😲 ☹️ 🙁 😖',
        '👍 👎 👊 ✊ 🤛',
        '☝️ ✋ 🤚 🖐 🖖',
        '👍🏼 👎🏼 👊🏼 ✊🏼 🤛🏼',
        '☝🏽 ✋🏽 🤚🏽 🖐🏽 🖖🏽',
        '🌖 🌗 🌘 🌑 🌒'
      ]
    }
  },
  mounted () {
    this.init()
    setTimeout(() => {
      console.log('2s: ')
      this.emojis = this.emojis2
      this.$nextTick(() => {
        this.bs.refresh()
      })
      
    }, 2000)
  },
  beforeDestroy () {
    this.bs.destroy()
  },
  methods: {
    init () {
      this.bs = new BScroll(this.$refs.scroll, {
        scrollX: true,
        probeType: 3 // listening scroll hook
      })
      this._registerHooks(['scroll', 'scrollEnd'], (pos) => {
        console.log('done')
      })
    },
    _registerHooks (hookNames, handler) {
      hookNames.forEach((name) => {
        this.bs.on(name, handler)
      })
    }
  }
}
</script>

测试一下, 完美解决了, 开心... 😁😁😁

相关推荐
熊的猫29 分钟前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
瑶琴AI前端1 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
会发光的猪。1 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
mosen8681 小时前
Uniapp去除顶部导航栏-小程序、H5、APP适用
vue.js·微信小程序·小程序·uni-app·uniapp
别拿曾经看以后~2 小时前
【el-form】记一例好用的el-input输入框回车调接口和el-button按钮防重点击
javascript·vue.js·elementui
我要洋人死2 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人2 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人2 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR2 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香2 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel