• 如何解决 Better-Scroll 可滚动区域的问题


    • Better-Scroll 在决定由多少区域可以滚动时,是根据 scrollerHeight 属性决定

      • scrollerHeight 属性是根据放 Better-Scroll 的 content 中的子组件的高度
      • 但是我们的首页中,刚开始在计算 scrollerHeight 属性时,是没有将图片计算在内的
      • 所有,计算出来的告诉是错误的(1300+)
      • 后来图片加载进来之后有了新的高度,但是 scrollerHeight 属性并没有进行更新
      • 所以滚动出现了问题
    • 如何解决这个问题

      • 监听每一张图片是否加载完成,只要有一张图片加载完成了,执行一次 refresh()
      • 如何监听图片加载完成了?
        • 原生的 js 监听图片 : img.onload() = function()
        • Vue 中的监听: @load = '方法'
      • 调用 scroll 的 refresh() 方法
    • 如何 进行 非父子 组件的 通信

      • 因为 涉及到 非父子组件的通信,所以这里我们 选择了 事件总线

        • bus -> 总线

        • Vue.probetype.$bus = new Vue() // 创建 vue实例

          // 在 main.js 中
          Vue.probetype.$bus = new Vue()
          
        • this.bus.emit('事件名称',参数1)

                // 在 传出的 组件中 
                <template>
                    <div>
                    	<img src= ""   @load = 'imageLoad' />
                    </div>
                <template>
                            
                <script>
                    export default {
                        methods: {
                            imageLoad() {
                                // 添加方法
                                this.$bus.$emit('ItemImageLoad')
                            }
                        }
                    }
                </script>
          
        • this.bus.on('事件名称',回调函数(参数))

          // 在 传入的 组件中
          
          <script>
          	export default {
                  、、、 //在 mounted 中使用
                  mounted() {
                      this.$bus.$on('ItemImageLoad',() => {
                          this.$refs.scroll.scroll.refresh()
                      })
                  }
                  、、、
              }
          </script>
          
    • 问题一: refresh 找不到的问题

      • 第一: 在 Scroll.vue 中, 调用 this.scroll 的方法之前,判断 this.scroll 对象是否 有值

        refresh() {
              this.scroll && this.scroll.refresh();
            }
        
      • 第二:在 mounted 生命周期 函数 中 使用 this.$refs.scroll 而 不是在 created中使用

    • 对于 refresh 非常 频繁 的问题,进行防抖操作

      • 防抖debounce / 节流 throttle

      • 防抖函数起作用的过程

        • 如果我们直接 执行 refresh ,那么 refresh 函数会被执行 请求数据多少 的次数

        • 可以 refresh 函数传入 到 deboundce 函数中,生成一个新的 函数

        • 之后再调用非常频繁的实收,就使用新生成的函数

        • 而新生成的函数,并不会非常频繁的调用,如果下一次执行来的非常快,那么会将上一次取消掉

              // 防抖动函数
              debounce(func, delay) {
                let timer = null;
          
                return function(...args) {
                  if (timer) clearTimeout(timer);
                  timer = setTimeout(() => {
                    func.apply(this,args);
                  }, delay);
                };
              }
          
  • 相关阅读:
    [置顶] location.href你真的会用了?
    Hive HA使用说明
    十进制转换为任意进制及操作符重载
    《重构》学习总结
    linux kill进程和子进程小trick
    express for node 路由route几种实现方式的思考
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 总结
    Can rename table but can not truncate table
    HBase
    链表解说和基本操作练习附代码
  • 原文地址:https://www.cnblogs.com/downrain/p/11707553.html
Copyright © 2020-2023  润新知