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>

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

相关推荐
IT、木易1 小时前
ES6 新特性,优势和用法?
前端·ecmascript·es6
is今夕1 小时前
postcss.config.js 动态配置基准值
javascript·vue.js·postcss
计算机软件程序设计1 小时前
vue和微信小程序处理markdown格式数据
前端·vue.js·微信小程序
指尖时光.1 小时前
【前端进阶】01 重识HTML,掌握页面基本结构和加载过程
前端·html
前端御书房1 小时前
Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程
前端·javascript·vue.js
NoneCoder2 小时前
JavaScript系列(84)--前端工程化概述
前端·javascript·状态模式
晚安7202 小时前
idea添加web工程
java·前端·intellij-idea
零凌林3 小时前
vue3中解决组件间 css 层级问题最佳实践(Teleport的使用)
前端·css·vue.js·新特性·vue3.0·teleport
糟糕好吃3 小时前
用二进制思维重构前端权限系统
前端