当前位置: 首页 > news >正文

关于多个elementui的cascader级联组件页面滚动渲染样式导致卡顿问题

如题,多个cascader级联组件,下拉选项含大量数据,滚动时会有实时样式重新渲染,导致CUP内存溢满而卡顿

小优化技巧:可加loading一次性加载完多个cascader级联组件后再允许页面滚动。

方法一:使用elementui中的内部源码的方法处理(推荐)

<script>
    // visible-change事件
    const cascaderVisibleChange = (val) => {
      const popperJsEle = refs.cascaderRef[0].popperJS
      if (val) {
        // 打开下拉时监听popper样式
        popperJsEle._setupEventListeners()
      } else {
        popperJsEle._removeEventListeners()
      }
      nextTick(() => {
        // 防止下拉框中滚动卡顿,去掉属性aria-owns
        const $el = document.querySelectorAll('.el-cascader-node[aria-owns]')
        Array.from($el).map(item => item.removeAttribute('aria-owns'))
      })
    }

    onMounted(() => {
      nextTick(() => {
         // 防止取不到poppperJS对象
        setTimeout(() => {
          // 调用内部方法,清除页面滚动实时监听给popper添加样式,导致内存溢满
          refs.cascaderRef[0].popperJS._removeEventListeners()
        }, 1000)
      })
    })
    
</script>

方法二:强制写入display: none;样式(次推荐)

<style lang="scss">
  .none-imp {
    display: none!important;
  }
</style>

// 当级联组件数据量大,滚动实时监听样式导致渲染消耗CPU内存溢出,可将其和子元素样式强制隐藏
const cascaderScrollStyle = (type) => {
    const popperEle = refs.cascaderRef[0].$refs.popper
    if (type === 'add') {
        // 父元素
        popperEle.classList.add('none-imp')
        // 第一个子元素
        popperEle.firstChild.classList.add('none-imp')
    } else if (type === 'remove') {
        popperEle.classList.remove('none-imp')
        popperEle.firstChild.classList.remove('none-imp')
    }
}

// 防止el-cascader数据量过大,选择时卡顿,去掉属性aria-owns
const cascaderVisibleChange = (val) => {
    if (val) {
        cascaderScrollStyle('remove')
    } else {
        cascaderScrollStyle('add')
    }
    nextTick(() => {
        // 下拉项滚动删除属性aria-owns
        const $el = document.querySelectorAll('.el-cascader-node[aria-owns]')
        Array.from($el).map(item => item.removeAttribute('aria-owns'))
    })
}

onMounted(() => {
    nextTick(() => {
        cascaderScrollStyle('add')
    })
})

相关文章:

  • 【机器学习可解释性】2.特征重要性排列
  • Node.js中的单线程服务器
  • nodejs+vue购物网站设计系统-计算机毕业设计
  • SolidWorks2020安装教程(超详细图文教程)
  • Python数据挖掘:入门、进阶与实用案例分析——基于非侵入式负荷检测与分解的电力数据挖掘
  • 【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】
  • 【设计模式】第5节:创建型模式之“简单工厂、工厂方法和抽象工厂模式”
  • vue重修之Vuex【下部】
  • P-MOS管开关机控制电路(手动按键控制和自动采样信号触发控制)
  • 蓝桥杯每日一题2023.10.22
  • Python基础学习004——for循环与字符串
  • 【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】
  • Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向
  • 【方法】如何给PDF文件添加“打开密码”?
  • 最近面试遇到的高频面试题
  • [数据分析与可视化] 基于Python绘制简单动图
  • C语言--程序环境和预处理(宏)
  • 做过哪些外设驱动?
  • 【网络安全 --- xss-labs靶场通关(11-20关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻
  • Gdb调试
  • 贸促会答澎湃:5月22日将举办2025年贸易投资促进峰会
  • 体坛联播|利物浦提前4轮夺冠,安切洛蒂已向皇马更衣室告别
  • 教育强国建设基础教育综合改革试点来了!改什么?怎么改?
  • 贵州通报9起群众身边不正之风和腐败问题典型案例
  • 上海2025年普通高等学校招生志愿填报与投档录取实施办法公布
  • 2025年两院院士增选工作启动,名额均不超过100名