element 表格有固定列时滚动不齐有迟滞性

解决方案是继承覆盖element的Table组件,并重写Table组件的bindEvents和syncPostion方法,因为根据源代码发现,Table中的syncPostion方法可能出于性能的原因使用了防抖,我们这里就直接把防抖拿掉了,但这不是产生问题的主要原因,这个只是会导致轻微的迟滞。

产生这个问题的最主要原因是:滚轮事件会自动触发滚动事件,滚动事件中自动使用了behavior: 'smooth’机制,这个机制会让滚动看起来很丝滑,但会耗费更多的性能,估计浏览器处于性能考虑导致两个滚动效果不同步了

所以解决方案就是取消掉滚轮事件的默认行为,我们自己手写滚动

import Vue from 'vue'
import { Table } from 'element-ui';
// 根据阅读Vue源代码(src/core/global-api/extend.js 第23~26),当Vue将一个配置对象注册成组件的时候,会自动的在配置上面
// 加上属性_Ctor,当再次使用同一个配置对象的时候,因为这个对象上面已经有_Ctor[SuperId]了,那么就会直接返回早已经注册后的
// 组件,导致我们下面的注册代码无效果
/* 这就是上述的Vue源代码
  const cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {})
  if (cachedCtors[SuperId]) {
    return cachedCtors[SuperId]
  }
*/
// 解决方案两个:1.直接让Vue.component...这段注册代码早于Vue.use(ElementUI) 2.执行 delete Table._Ctor后再注册
delete Table._Ctor
Vue.component(
  Table.name,
  function(resolve){
    const bindEvents = Table.methods.bindEvents
    Object.assign(Table.methods,{
      bindEvents() {
        bindEvents.call(this)
        this.bodyWrapper.addEventListener('mousewheel', this.handleBodyMousewheel)
      },
      handleBodyMousewheel(event) {
        const fixedWrapper = this.$refs.fixedWrapper
        if (fixedWrapper) {
          const fixedBodyWrapper = fixedWrapper.querySelector('.el-table__fixed-body-wrapper')
          if (fixedBodyWrapper) {
            event.preventDefault()
            fixedBodyWrapper.scrollBy({ left: event.deltaX, top: event.deltaY })
            this.$refs.bodyWrapper.scrollBy({ left: event.deltaX, top: event.deltaY })
          }
        }
      }
    })
    resolve(Table)
  }
)
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值