关于多个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')
})
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏