如题,多个cascader级联组件,下拉选项含大量数据,滚动时会有实时样式重新渲染,导致CUP内存溢满而卡顿
解决尝试:使用elementui中的内部源码方法处理
<script>
import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event';
...
setup(){
onMounted(){
refs.cascaderRef.removeResizeListener();
}
// 折叠,展开
const cascaderVisibleChange = (val) => {
if (val) {
refs.cascaderRef.addResizeListener();
} else {
refs.cascaderRef.removeResizeListener();
}
}
}
</script>
注:测试后无效,弹窗样式实时更新;
# 解决方法:强制写入display: none;样式,可加loading一次性加载完后再允许滚动
<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')
})
})